【发布时间】:2013-09-07 21:53:45
【问题描述】:
有没有办法创建线程来一次运行多个方法?
这样,如果任何方法在所有其他线程之间失败,则应该被杀死。
【问题讨论】:
标签: multithreading node.js asynchronous parallel-processing
有没有办法创建线程来一次运行多个方法?
这样,如果任何方法在所有其他线程之间失败,则应该被杀死。
【问题讨论】:
标签: multithreading node.js asynchronous parallel-processing
每个 node.js 进程在设计上都是单线程的。因此,要获得多个线程,您必须拥有多个进程(正如其他一些海报所指出的那样,您还可以链接到一些库,这些库将使您能够在 Node 中使用线程,但如果没有这些库,则不存在这样的能力. 参见 Shawn Vincent 的回答,引用 https://github.com/audreyt/node-webworker-threads)
您可以从主进程启动子进程,如 node.js 文档中所示:http://nodejs.org/api/child_process.html。此页面上的示例非常好,并且非常简单。
然后,您的父进程可以监视它启动的任何进程上的关闭事件,然后可以强制关闭您启动的其他进程,以实现您正在谈论的一种失败所有停止策略的类型。
【讨论】:
还有至少一个库用于从 Node.js 中执行本机线程:node-webworker-threads
https://github.com/audreyt/node-webworker-threads
这基本上实现了 node.js 的Web Worker browser API。
【讨论】:
From Node 10.5 there is now multi threading support,但它是实验性的。希望这会很快稳定下来。
查看以下资源:
更新:
从 Node v11.7.0 开始,您不必使用 --experimental-worker 标志。
【讨论】:
您可以使用 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 中的真正的多线程,而对我有用的是threads 包。它生成另一个进程,拥有自己的 Node.js 消息循环,因此它们不会相互阻塞。设置很简单,文档可以帮助您快速启动和运行。您的主程序和工作人员可以通过两种方式进行通信,如果需要,可以终止工作人员“线程”。
由于多线程和 Node.js 是一个复杂且广泛讨论的话题,因此很难找到适合 my 特定需求的包。作为记录,这些对我不起作用:
require-ing 模块对于那些问我为什么需要真正的多线程的人:对于涉及 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,虽然我不确定项目状态。
【讨论】:
NodeJS 现在包含 threads(作为回答时的实验性功能)。
【讨论】:
您可能正在寻找 Promise.race(本机 I/O 竞赛解决方案,而不是线程)
假设您(或其他搜索此问题的人)想要竞速线程以避免失败并避免 I/O 操作的成本,这是一种简单且原生的方式来完成它(不使用线程)。 Node 设计为单线程(查找事件循环),因此尽可能避免使用线程。如果我的假设是正确的,我建议您使用Promise.race 和setTimeout(链接中的示例)。使用此策略,您将竞争一个 Promise 列表,每个 Promise 都尝试一些 I/O 操作,如果出现错误(否则超时)则拒绝该 Promise。 Promise.race 语句在第一次解决/拒绝后继续,这似乎是您想要的。希望这对某人有帮助!
【讨论】:
Node.js 不使用线程。根据其发明者的说法,这是一个关键特征。在它发明的时候,线程是缓慢的、有问题的和困难的。 Node.js 是在对一种高效的单核替代方案进行调查后创建的。大多数 Node.js 爱好者仍然引用 ye olde 的论点,好像线程在过去 50 年中没有得到改进。
如您所知,Node.js 用于运行 JavaScript。 JavaScript 语言也经过多年发展。它现在有使用多核的方法——即线程做什么。因此,通过 JavaScript 的进步,您可以在应用程序中执行一些多核多任务。 user158 指出 Node.js 正在使用它。我对此一无所知。但是,为什么要等待 Node.js 批准 JavaScript 所提供的功能。
Google for JavaScript 多线程而不是 Node.js 多线程。您将了解 Web Worker、Promises 和其他内容。
【讨论】:
你不能在 node.js 中本地运行多个线程,但是如果你真的需要从主线程卸载一些代码,你总是可以使用 child_process fork() 在另一个进程中运行它自己的一些代码PID 和内存。
【讨论】: