В 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);
}
Рабочий генерирует огромное количество данных, а «postMessage» вызывает ошибку сервера.
Есть ли способ отправить эти данные из рабочего потока напрямую клиенту, используя res.send()
или что-то подобное?
(вместо использования postMessage
и последующей отправки из основного потока)?