【发布时间】:2013-01-09 11:02:57
【问题描述】:
有谁知道 NodeJS 对 Web Worker 的支持情况如何?我找到了一个两年前的实现,node-webworkers,但它不能在当前的 NodeJS 版本中运行。
【问题讨论】:
标签: html node.js web-worker
有谁知道 NodeJS 对 Web Worker 的支持情况如何?我找到了一个两年前的实现,node-webworkers,但它不能在当前的 NodeJS 版本中运行。
【问题讨论】:
标签: html node.js web-worker
现在有https://github.com/audreyt/node-webworker-threads 似乎正在积极维护。
【讨论】:
Worker Threads 在 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)); }
【讨论】:
你可以使用child processes,他们解决了类似的问题。
【讨论】:
您可以查看 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 工作者使用addEventListener 添加了一个message 事件处理程序,因此我在global 中注册了这样一个函数并保存了该处理程序。我还必须提供一个postMessage 实现。最后,我注册了一个调用 HTML5 处理程序的 Node.js 消息处理程序。
一切都很完美。无需任何特殊依赖,只需查看 HTML5 工作代码并确定它处理消息的点即可。
【讨论】: