admin管理员组

文章数量:815012

是否可以在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中使用带有工作线程的服务?

是,如果正确地编写了工作线程和调用它的路由。

这里有很多错误:

  1. 您在路由中调用threadN(),但是在主线程中所做的所有工作都是将parseJSAsync分配给module.exports。它实际上不会在另一个线程中调用任何东西,甚至不会创建另一个线程。它不调用parseJSAsync()
  2. 在模块初始化后很长时间为module.exports分配内容是一种反模式,它可能没有任何用处。在您将parseJSAsync分配给它之前,任何导入模块都已经在寻找可能在导出中找到的内容。
  3. threadTest()中,您调用threadN(),但这对处理请求没有任何帮助。似乎您需要先调用parseJSAsync(),然后使用返回的诺言。

本文标签: 是否可以在NodeJS中使用工作线程使用服务