use*_*867 87 parallel-processing multithreading asynchronous node.js
有没有办法创建一次运行多个方法的线程.如果任何方法失败,则应该杀死所有其他线程.
提前致谢
Bri*_*ian 93
每个node.js进程都是单线程设计.因此,要获得多个线程,您必须拥有多个进程(正如其他一些海报所指出的那样,您还可以链接到的库将使您能够使用Node中的线程,但如果没有这些库,则不存在此类功能请参阅Shawn Vincent的回答,参考https://github.com/audreyt/node-webworker-threads)
您可以从主进程启动子进程,如node.js文档中所示:http: //nodejs.org/api/child_process.html.这个例子在这个页面上相当不错,非常简单.
然后,您的父进程可以监视它启动的任何进程上的close事件,然后可以强制关闭您启动的其他进程,以实现您正在讨论的一个失败全停策略的类型.
另请参阅: 多核计算机上的Node.js
小智 33
还有至少一个用于在Node.js中执行本机线程的库:node-webworker-threads
https://github.com/audreyt/node-webworker-threads
这基本上实现了node.js 的Web Worker浏览器API.
use*_*158 18
从Node 10.5开始,现在有多线程支持,但它是实验性的.希望这会很快变得稳定.
结帐以下资源:
更新:
从Node v11.7.0开始,您不必使用--experimental-worker标志.
发行说明:https://nodejs.org/en/blog/release/v11.7.0/
你可以使用Napa.js获得多线程.
https://github.com/Microsoft/napajs
"Napa.js是一个基于V8构建的多线程JavaScript运行时,最初设计用于在Bing中开发具有非妥协性能的高度迭代服务.随着它的发展,我们发现在CPU绑定任务中补充Node.js很有用. ,具有在多个V8隔离区中执行JavaScript并在它们之间进行通信的能力.Napa.js作为Node.js模块公开,同时它也可以嵌入到没有Node.js依赖的主机进程中.
我需要Node.js 中真正的多线程,而对我有用的是线程包。它会生成另一个拥有自己的 Node.js 消息循环的进程,因此它们不会互相阻塞。设置很简单,文档可以帮助您快速启动和运行。您的主程序和工作人员可以以两种方式进行通信,并且如果需要,可以杀死工作人员“线程”。
由于多线程和 Node.js 是一个复杂且广泛讨论的主题,因此很难找到适合我的特定要求的包。根据记录,这些对我不起作用:
require在我需要的工作人员中使用模块对于那些问我为什么需要真正的多线程的人:对于涉及 Raspberry Pi 和中断的应用程序。一个线程正在处理这些中断,另一个线程负责存储数据(以及更多)。
Nodejs 10.5.0 版本宣布了 Node.js 中的多线程。该功能仍处于实验阶段。现在有一个新的worker_threads模块可用。
\n\n如果您运行Node.js v10.5.0 或更高版本,则可以开始使用工作线程,但这是一个实验性 API。默认情况下它不可用:您需要在调用 Node.js 时使用\xe2\x80\x8a --experimental-worker来启用它。
\n\n这是启用ES6和worker_threads的示例,在版本 12.3.1 上测试
\n\n//package.json\n\n "scripts": {\n "start": "node --experimental-modules --experimental- worker index.mjs"\n },\nRun Code Online (Sandbox Code Playgroud)\n\n现在,您需要从worker_threads导入Worker 。\n注意:您需要声明扩展名为“.mjs”的 js文件以支持 ES6。
\n\n//index.mjs\nimport { Worker } from \'worker_threads\';\n\nconst spawnWorker = workerData => {\n return new Promise((resolve, reject) => {\n const worker = new Worker(\'./workerService.mjs\', { workerData });\n worker.on(\'message\', resolve);\n worker.on(\'error\', reject);\n worker.on(\'exit\', code => code !== 0 && reject(new Error(`Worker stopped with \n exit code ${code}`)));\n })\n}\n\nconst spawnWorkers = () => {\n for (let t = 1; t <= 5; t++)\n spawnWorker(\'Hello\').then(data => console.log(data));\n}\n\nspawnWorkers();\nRun Code Online (Sandbox Code Playgroud)\n\n最后我们创建一个workerService.mjs
\n\n//workerService.mjs\nimport { workerData, parentPort, threadId } from \'worker_threads\';\n\n// You can do any cpu intensive tasks here, in a synchronous way\n// without blocking the "main thread"\nparentPort.postMessage(`${workerData} from worker ${threadId}`);\nRun Code Online (Sandbox Code Playgroud)\n\n输出:
\n\n\n\n\nnpm 运行开始
\n
Hello from worker 4\nHello from worker 3\nHello from worker 1\nHello from worker 2\nHello from worker 5\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
130323 次 |
| 最近记录: |