如何在nodejs中创建线程

时间:2013-09-04 11:48:51

标签: multithreading node.js asynchronous parallel-processing

有没有办法一次创建运行多个方法的线程。如果任何方法失败,则应该杀死所有其他线程 提前致谢

11 个答案:

答案 0 :(得分:89)

每个node.js进程都是单线程设计。因此,要获得多个线程,您必须拥有多个进程(正如其他一些海报所指出的那样,您还可以链接到的库将使您能够使用Node中的线程,但如果没有这些库,则不存在此类功能请参阅Shawn Vincent引用https://github.com/audreyt/node-webworker-threads

的答案

您可以从主进程启动子进程,如node.js文档中所示:http://nodejs.org/api/child_process.html。这个例子在这个页面上相当不错,非常简单。

然后,您的父进程可以在其启动的任何进程上监视close事件,然后可以强制关闭您开始实现的其他进程,以实现您正在讨论的一种失败全停策略。

另见:Node.js on multi-core machines

答案 1 :(得分:33)

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

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

这基本上实现了node.js的Web Worker browser API

答案 2 :(得分:15)

From Node 10.5 there is now multi threading support,但实验性。希望这会很快稳定。

结帐以下资源:


更新

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

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

答案 3 :(得分:9)

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

https://github.com/Microsoft/napajs

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

答案 4 :(得分:4)

如果您正在使用Rx,则在rxjs-cluster中插入以将工作拆分为并行执行相当简单。 (免责声明:我是作者)

https://www.npmjs.com/package/rxjs-cluster

答案 5 :(得分:2)

现在还有https://github.com/xk/node-threads-a-gogo,虽然我对项目状态不确定。

答案 6 :(得分:2)

我在Node.js中需要真正的多线程,为我工作的是threads包。它产生了另一个拥有它自己的Node.js消息循环的进程,因此它们不会相互阻塞。设置非常简单,文档可以帮助您快速启动和运行。您的主程序和工作人员可以通过双向沟通和工作人员的线程进行沟通。如果需要可以杀死。

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

  • tiny-worker允许产卵工作者,但他们似乎共享相同的消息循环(但可能是我做错了 - threads有更多的文档让我有信心真的使用了多个进程,所以我一直坚持到有效为止)
  • webworker-threads不允许require我需要的工人模块

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

答案 7 :(得分:2)

NodeJS现在包括threads(作为回答时的实验功能)。

答案 8 :(得分:1)

您可能正在寻找Promise.race(原生I / O赛车解决方案,而非线程)

假设您(或其他人正在搜索此问题)想要竞争线程以避免失败并避免I / O操作的成本,这是一种简单且本地的方法来实现它(它不使用线程)。 Node被设计为单线程(查找事件循环),因此尽可能避免使用线程。如果我的假设是正确的,我建议您将Promise.racesetTimeout一起使用(链接中的示例)。使用此策略,您将竞争一个承诺列表,每个承诺尝试一些I / O操作,并在出现错误时拒绝承诺(否则超时)。 Promise.race语句在第一次解决/拒绝后继续,这似乎是您想要的。希望这有助于某人!

答案 9 :(得分:0)

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和其他内容的信息。

答案 10 :(得分:0)

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。 注意:为了支持ES6,您需要声明具有'。mjs'扩展名 js 文件。

//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
相关问题