javascript - 在 Node.js 中并行化任务

标签 javascript multithreading node.js asynchronous parallel-processing

我想在 JS 中完成一些资源密集型任务。对于这个问题,我们假设它们是一些繁重的计算,而不是系统访问。现在我想同时运行任务A、B和C,完成后执行一些函数D。

async library为此提供了一个很好的脚手架:

async.parallel([A, B, C], D);

如果我正在做的只是计算,那么它仍然会同步运行(除非库本身将任务放在不同的线程上,我预计情况并非如此)。我如何使它实际上是平行的?异步代码通常会做什么来不阻塞调用者(使用 NodeJS 时)?是否开始 child process ?

最佳答案

2022 notice: this answer predates the introduction of worker threads in Node.js

我如何让这实际上是平行的?

首先,您不会真正在单 Node 应用程序中并行运行。 Node 应用程序在单个线程上运行, Node 的事件循环一次只处理一个事件。即使在多核机器上运行,您也不会在 Node 应用程序中获得并行处理。

也就是说,您可以在多核机器上获得处理并行性 via forking the code into separate node processesby spawning child process .实际上,这允许您创建 Node 本身的多个实例并以不同的方式与这些进程通信(例如标准输出、进程 fork IPC 机制)。此外,您可以选择将功能(按职责)分离到它们自己的 Node 应用程序/服务器中,并通过 RPC 调用它。

async 代码通常会做什么来不阻塞调用者(使用 NodeJS 时)? 它是否启动了一个子进程?强>

它没有开始一个新的进程。在下方,when async.parallel is used in node.js ,它正在使用 process.nextTick()。 nextTick() 允许您通过将工作推迟到新堆栈上来避免阻塞调用者,这样您就可以交错 CPU 密集型任务等。

长话短说

Node 无法轻松“开箱即用”地实现多处理器并发。相反,Node 为您提供了一个非阻塞设计和一个利用线程而不共享内存的事件循环。多个线程不能共享数据/内存,因此不需要锁。 Node 无锁。一个 Node 进程利用一个线程,这使得 Node 既安全又强大。

当您需要在多个进程之间拆分工作时,请使用某种消息传递与其他进程/服务器进行通信。例如IPC/RPC。


更多请看:

SO 在 What is Node.js 上的精彩回答...有很多好处。

Understanding process.nextTick()

关于javascript - 在 Node.js 中并行化任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19120213/

相关文章:

javascript - 如何多次使用 <div ng-view = "">

javascript - Java套接字io未知传输未定义

java - 守护线程可以被杀死吗?

iphone - Objective-C UImage imageWithData问题

javascript - 如何在 moment.js 中正确地将 1 个月添加到当前日期

javascript - 如何使用正则表达式验证此类输入?

javascript - Nodejs 在模块之间传递日志实例

javascript - 如何过滤谷歌地方自动完成建议?

javascript - Angular UI-Router 在子状态下覆盖解析

c# - 异步和等待 - 如何维护执行顺序?