【发布时间】:2020-02-25 22:01:30
【问题描述】:
在 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
);
});
工人看起来像这样:
// 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,然后从主线程发送)?
【问题讨论】:
-
流有帮助吗?
-
不确定您的确切用例,但您应该能够使用 res.write() 流式传输值,如下所示:gist.github.com/montanaflynn/6a438f0be606daede899
-
我仍然需要将数据从工作线程发送到主线程,然后才能使用 res.write()。 Streams 可能仍然有用,因为我必须每次发送 Les 数据。
-
您找到解决方案了吗@HendrikJan?我面临着类似的问题。
-
@lukas1994 我没有找到直接从工作线程发送的方法。请参阅我的回答,了解我最终如何解决我的问题。
标签: javascript node.js express worker-thread