线程使用服务?"/>
是否可以在NodeJS中使用工作线程使用服务?
[我正在用NodeJS进行编码,我正在尝试提供一个内部使用多线程的API服务,我已经阅读了很多工作线程教程,但没有找到解决方案。
在classes / controller.js中:
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
const os = require('os');
...
var threadN = function()
{
if (isMainThread)
{
module.exports = function parseJSAsync(script)
{
return new Promise
(
(resolve, reject) =>
{
const worker = new Worker(filename, {workerData: script});
worker.on('message', resolve);
worker.on('error', reject);
worker.on
(
'exit',
(code) =>
{
if (code !== 0)
{
reject(new Error(`Worker stopped with exit code ${code}`));
}
}
);
}
);
};
console.log('Thread ID: ', Worker.threadId, "\nNumber of CPU's:", os.cpus().length);
}
else
{
console.log('Thread ID: ', Worker.threadId, "\nNumber of CPU's:", os.cpus().length);
const { parse } = require('some-js-parsing-library');
const script = workerData;
parentPort.postMessage(parse(script));
}
};
...
exports.threadTest = function (req, res)
{
threadN();
res.json
({
status: true,
message: 'Hello World!'
});
};
在routes / routes.js中
var app = express();
...
app.get("/api_1.0/threadtest", model.threadTest);
...
[当我在Postman中使用它并查看控制台更改时,我必须获得带有四个线程ID的四个消息(我的CPU具有四个内核),否则我会收到此消息:
如何使用worker_thread正确使用API服务?
回答如下:是否有可能在NodeJS中使用带有工作线程的服务?
是,如果正确地编写了工作线程和调用它的路由。
这里有很多错误:
- 您在路由中调用
threadN()
,但是在主线程中所做的所有工作都是将parseJSAsync
分配给module.exports
。它实际上不会在另一个线程中调用任何东西,甚至不会创建另一个线程。它不调用parseJSAsync()
。 - 在模块初始化后很长时间为
module.exports
分配内容是一种反模式,它可能没有任何用处。在您将parseJSAsync
分配给它之前,任何导入模块都已经在寻找可能在导出中找到的内容。 - 在
threadTest()
中,您调用threadN()
,但这对处理请求没有任何帮助。似乎您需要先调用parseJSAsync()
,然后使用返回的诺言。
更多推荐
是否可以在NodeJS中使用工作线程使用服务?
发布评论