如何在nodejs中创建线程

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

  • 子进程独立于父进程.它们有自己的内存空间,PID和执行时间.不确定顺序是什么意思,但是,它们将并行运行并由OS单独安排执行. (2认同)
  • 嗯,不知道那个库,但它确实看起来像每个Alex Mills评论你可以在Node做一些线程工作.话虽如此,下一个问题应该是你...节点的设计从免费程序员到复杂的线程,但产生类似的类型性能以阻止I/O. 我将编辑我的答案,说明可以使用引用的库. (2认同)

小智 33

还有至少一个用于在Node.js中执行本机线程的库:node-webworker-threads

https://github.com/audreyt/node-webworker-threads

这基本上实现了node.js 的Web Worker浏览器API.

  • 这应该是正确的.答案表明节点只能生成进程,而不是线程,这是错误的. (3认同)

use*_*158 18

从Node 10.5开始,现在有多线程支持,但它是实验性的.希望这会很快变得稳定.

结帐以下资源:


更新:

从Node v11.7.0开始,您不必使用--experimental-worker标志.

发行说明:https://nodejs.org/en/blog/release/v11.7.0/


shm*_*uli 9

你可以使用Napa.js获得多线程.

https://github.com/Microsoft/napajs

"Napa.js是一个基于V8构建的多线程JavaScript运行时,最初设计用于在Bing中开发具有非妥协性能的高度迭代服务.随着它的发展,我们发现在CPU绑定任务中补充Node.js很有用. ,具有在多个V8隔离区中执行JavaScript并在它们之间进行通信的能力.Napa.js作为Node.js模块公开,同时它也可以嵌入到没有Node.js依赖的主机进程中.


Hei*_*cht 7

我需要Node.js 中真正的多线程,而对我有用的线程包。它会生成另一个拥有自己的 Node.js 消息循环的进程,因此它们不会互相阻塞。设置很简单,文档可以帮助您快速启动和运行。您的主程序和工作人员可以以两种方式进行通信,并且如果需要,可以杀死工作人员“线程”。

由于多线程和 Node.js 是一个复杂且广泛讨论的主题,因此很难找到适合我的特定要求的包。根据记录,这些对我不起作用

  • tiny-worker允许生成工作人员,但它们似乎共享相同的消息循环(但可能是我做错了什么 -线程有更多文档让我相信它确实使用了多个进程,所以我一直继续直到它起作用)
  • webworker-threads不允许require在我需要的工作人员中使用模块

对于那些问我为什么需要真正的多线程的人:对于涉及 Raspberry Pi 和中断的应用程序。一个线程正在处理这些中断,另一个线程负责存储数据(以及更多)。

  • 我很欣赏这个答案的伟大思想! (2认同)

Pri*_*kar 5

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

这是启用ES6worker_threads的示例,在版本 12.3.1 上测试

\n\n
//package.json\n\n  "scripts": {\n  "start": "node  --experimental-modules --experimental- worker index.mjs"\n  },\n
Run 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();\n
Run 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}`);\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n
\n

npm 运行开始

\n
\n\n
Hello from worker 4\nHello from worker 3\nHello from worker 1\nHello from worker 2\nHello from worker 5\n
Run Code Online (Sandbox Code Playgroud)\n

  • 这是您的文章吗:https://blog.logrocket.com/node-js-multithreading-what-are-worker-threads-and-why-do-they-matter-48ab102f8b10/? (2认同)