Answers:
每个node.js进程在设计上都是单线程的。因此,要获得多个线程,您必须具有多个进程(正如其他一些发帖人所指出的那样,您还可以链接到一些库,这些库使您能够使用Node中的线程,但是没有这些库就不存在这种功能。请参阅Shawn Vincent的回答,参考https://github.com/audreyt/node-webworker-threads)
您可以从主要流程启动子流程,如node.js文档中所示:http : //nodejs.org/api/child_process.html。该示例在此页面上非常好,并且非常简单。
然后,您的父进程可以在它启动的任何进程上监视close事件,然后可以强制关闭您启动的其他进程,以实现您正在谈论的一种“全部失败”的失败策略。
另请参阅: 多核计算机上的Node.js
还有至少一个库用于在Node.js中执行本机线程:node-webworker-threads
https://github.com/audreyt/node-webworker-threads
这基本上为node.js 实现了Web Worker浏览器API。
从Node 10.5开始,现在有多线程支持,但这是试验性的。希望这会很快稳定。
签出以下资源:
更新:
从Node v11.7.0起,您不必使用--experimental-worker
flag。
您可以使用Napa.js获得多线程。
https://github.com/Microsoft/napajs
“ Napa.js是基于V8构建的多线程JavaScript运行时,其最初旨在在Bing中开发具有出色性能的高度迭代服务。随着它的发展,我们发现在对CPU限制的任务中补充Node.js很有用。 ,并具有在多个V8隔离中执行JavaScript并在它们之间进行通信的能力。Napa.js公开为Node.js模块,而它也可以嵌入到宿主进程中而不受Node.js的依赖。”
如果您使用的是Rx,则将其插入rxjs-cluster可以很容易地将工作拆分为并行执行。(免责声明:我是作者)
我需要在Node.js中使用真正的多线程,对我有用的是线程包。它产生另一个具有自己的Node.js消息循环的进程,因此它们不会互相阻塞。设置很容易,文档可以帮助您快速启动和运行。您的主程序和工作程序可以通过两种方式进行通信,如果需要,可以杀死工作程序“线程”。
由于多线程和Node.js是一个复杂且广泛讨论的主题,因此很难找到适合我的特定需求的软件包。根据记录,这些对我不起作用:
require
在我需要的工作程序中添加模块对于那些问我为什么需要真正的多线程的人:对于涉及Raspberry Pi和中断的应用程序。一个线程正在处理这些中断,而另一个则负责存储数据(以及更多)。
nodejs 10.5.0发行版宣布了Node.js中的多线程。该功能仍处于试验阶段。现在有一个新的worker_threads模块。
如果运行Node.js v10.5.0或更高版本,则可以开始使用辅助线程,但这是一个实验性API。默认情况下不可用:调用Node.js时,需要使用--experimental-worker启用它 。
这是一个启用ES6和worker_threads的示例,已在12.3.1版上进行了测试
//package.json
"scripts": {
"start": "node --experimental-modules --experimental- worker index.mjs"
},
现在,您需要从worker_threads导入Worker 。注意:您需要声明扩展名为.mjs的js文件以支持ES6。
//index.mjs
import { Worker } from 'worker_threads';
const spawnWorker = workerData => {
return new Promise((resolve, reject) => {
const worker = new Worker('./workerService.mjs', { workerData });
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', code => code !== 0 && reject(new Error(`Worker stopped with
exit code ${code}`)));
})
}
const spawnWorkers = () => {
for (let t = 1; t <= 5; t++)
spawnWorker('Hello').then(data => console.log(data));
}
spawnWorkers();
最后,我们创建一个workerService.mjs
//workerService.mjs
import { workerData, parentPort, threadId } from 'worker_threads';
// You can do any cpu intensive tasks here, in a synchronous way
// without blocking the "main thread"
parentPort.postMessage(`${workerData} from worker ${threadId}`);
输出:
npm运行开始
Hello from worker 4
Hello from worker 3
Hello from worker 1
Hello from worker 2
Hello from worker 5
现在也有https://github.com/xk/node-threads-a-gogo,尽管我不确定项目状态。
您可能正在寻找Promise.race
(本机I / O竞速解决方案,而不是线程)
假设您(或其他搜索此问题的人)希望争用线程以避免失败并避免I / O操作的成本,这是一种简单且本机的实现方式(不使用线程)。Node被设计为单线程的(查找事件循环),因此请尽可能避免使用线程。如果我的假设是正确的,我建议您使用Promise.race
with setTimeout
(链接中的示例)。使用这种策略,您将竞标一个承诺列表,每个承诺都会尝试一些I / O操作,如果出现错误(否则超时),则拒绝该承诺。Promise.race
在第一次解决/拒绝之后,该语句继续,这似乎是您想要的。希望这对某人有帮助!
Node.js不使用线程。据其发明家说,这是关键特征。在其发明之时,线程是缓慢的,有问题的和困难的。Node.js的创建是对有效单核替代方案进行调查的结果。大多数Node.js爱好者仍然引用旧的说法,好像在过去50年中线程没有得到改善。
如您所知,Node.js用于运行JavaScript。多年来,JavaScript语言也得到了发展。现在,它具有使用多个内核的方式-即线程的功能。因此,通过JavaScript的改进,您可以在应用程序中执行一些多核多任务处理。user158指出Node.js正在使用它。我对此一无所知。但是,为什么要等待Node.js批准JavaScript所提供的功能。
Google for JavaScript多线程而不是Node.js多线程。您将了解有关Web Workers,Promise和其他内容的信息。