7

任何人都知道 NodeJS 中 Web Worker 支持的状态是什么?我找到了一个两年前的实现,node-webworkers,但它没有在当前的 NodeJS 版本中运行。

4

4 回答 4

7

现在有https://github.com/audreyt/node-webworker-threads似乎正在积极维护。

于 2014-11-07T19:35:57.767 回答
5

工作线程在 12 LTS 中达到稳定状态。使用示例

const {
  Worker, isMainThread, parentPort, workerData
} = require('worker_threads');

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}`));
      });
    });
  };
} else {
  const { parse } = require('some-js-parsing-library');
  const script = workerData;
  parentPort.postMessage(parse(script));
}
于 2019-11-17T20:10:02.393 回答
3

您可以使用子进程,它们可以解决类似的问题。

于 2013-01-25T13:28:00.463 回答
2

您可以查看 HTML5 WebWorker 源代码的细节。

稍加注意,您可以通过添加可能看起来像这样的前奏来“纠正” WebWorker 以适应 Node.js 工作者:

const { parentPort } = require('worker_threads')

global.postMessage = function(msg){
    parentPort.postMessage(msg)
}

var handler

global.addEventListener = function(kind, callback){
    handler = callback    
}

parentPort.on('message', msg => {
    handler(msg)
})

特定的 HTML5 工作人员使用 添加了一个message事件处理程序addEventListener,因此我在其中注册了这样一个函数global并保存了该处理程序。我还必须提供一个postMessage实现。最后,我注册了一个调用 HTML5 处理程序的 Node.js 消息处理程序。

一切都很完美。不需要任何特殊的依赖,只需查看 HTML5 工作代码并确定它处理消息的点。

于 2020-10-25T11:38:44.093 回答