gpt4 book ai didi

javascript - Nodejs 和 Express,从工作线程使用 res.send()

转载 作者:太空宇宙 更新时间:2023-11-03 22:19:53 24 4
gpt4 key购买 nike

在 Nodejs 中,使用 Express 作为服务器,我将繁重的计算卸载到工作线程上。

在主应用程序中,我这样调用工作线程:

// file: main.js

const { Worker } = require("worker_threads");

function runService(fileName, workerData) {
return new Promise((resolve, reject) => {
const worker = new Worker(fileName, { workerData });
worker.on("message", resolve);
worker.on("error", reject);
worker.on("exit", code => {
if (code !== 0)
reject(new Error(`Worker stopped with exit code ${code}`));
});
});
}

router.get("/some_url", async function(req, res) {
const result = await runService(
"./path/to/worker.js",
{ query: req.query, user: req.user } // using { req } causes an error
);
});

worker 看起来像这样:

// file: worker.js

const { workerData, parentPort } = require('worker_threads');
const { query, user } = workerData;

async function run() {
const result = await generateLotsOfData(query, user);

parentPort.postMessage(result);

// What I would like to do here (doesn't work): res.send(result);
}

worker 生成大量数据,“postMessage”导致服务器错误。

有没有办法使用 res.send() 或类似的东西将这些数据从工作线程直接发送到客户端?
(而不是使用 postMessage 然后从主线程发送)?

最佳答案

此代码示例有效:

  1. 创建工作人员
  2. 创建事件处理程序
  3. sendMessage --> 包装器WorkerThreadBigComputing
  4. 在我们的主线程上发送消息
  5. 发出服务器响应

API 路线:

app.get('/bigComputingWithWorker', (req, res) => {
const worker = new Worker(`${__dirname}/src/wrapperWorkerThreadBigComputing.js`);
res.set('Content-Type', 'text/html');
worker.once("message", count => {
res.status(200).send(`The final count :${count}`);
});
worker.once("error", err => {
console.error(err);
res.status(400).send(`error worker thread`);
});
worker.postMessage({coucou : 'john'});
});

wrapperWorkerThreadBigComputing

const { parentPort } = require('node:worker_threads');

console.log("* worker created");
parentPort.once('message', (message) => {
let big = bigComputing();
parentPort.postMessage(big);
})

function bigComputing() {
let i = 0;
console.log("* start big computing")
for (i = 0; i < 300000000; i++) {
}
return i;
}

关于javascript - Nodejs 和 Express,从工作线程使用 res.send(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58628173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com