node.js - 除了node.js的child_processes之外,是否有一个相当于异步库的东西

标签 node.js asynchronous parallel-processing

热门async Node 中的库在处理 Node 中异步函数的许多复杂控制结构方面做得很好。例如,假设我有一组银行帐户 ID,我想从 API 检索它们的余额,然后对结果余额求和。我可以通过执行以下操作以异步方式实现此目的:

var accountIds = [0001,0002,0003,0004,0005,0006]
async.mapLimit(accountIds,
  3,
  function fetchBalance(accountID, cbk) {
    var balanceURL = "http://someapi.com/account/balance/" + accountID;
    get(balanceURL, cbk);
  },
  function end(err, balances) {
    if (err) {
      console.err(err);
    }
    console.log(sum(balances));
  }
);

这使我不必编写管道来跟踪同时分派(dispatch)多少个异步函数,确保所有函数最终完成,跟踪错误等。此外,它在 Node 中运行良好,因为 I/O(在Web 请求的形式)是该程序的限制因素。

但是,让我们想象一下,我们的任务不是受 I/O 限制的,而是受 CPU 限制的。异步不会给我带来任何真正的性能优势,因为 Node.js 只会运行一个主线程。在 Node 中并行化此类工作负载的一种解决方案可能是使用 child_process库并生成一堆工作进程来处理 CPU 密集型工作。我的问题是,是否有一个库可以处理这些工作流程的管道/协调,就像 async 对 I/O 绑定(bind)、异步函数所做的那样?如果没有的话,这还值得写吗?我认为这可能是一个有趣的练习。

最佳答案

我认为应该可以使用 async 和 child_process 来实现你想要的。

async.mapLimit(accountIds, 3, function(accountId, next) {
    child_process.execFile('myworker.js', [accountId], next);
}, function(err, results) {
    console.log('done', err, results);
});

我想spawn/fork也可以使用,但是你必须监听事件而不是回调来检查过程是否完成。

显然 myworker.js 应该进行一些繁重的计算,否则这最终会比在主线程中执行要慢。来自nodejs documentation 这些子 Node 仍然是 V8 的全新实例。假设每个新 Node 至少有 30ms 启动时间和 10mb 内存。也就是说,您无法创建数千个。

如果您要经常使用这些进程,最好创建一次并向它们发送消息来完成工作,以避免启动成本。

关于node.js - 除了node.js的child_processes之外,是否有一个相当于异步库的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24563658/

相关文章:

node.js - 无法读取 Node js中未定义的属性 'pipe'

node.js - 使用 node-oauth 和通行证对 Twitter API 进行授权调用

javascript - 等待函数调用的顺序

linux - xargs 可以用于并行运行多个任意命令吗?

mysql - 使用 Express 和 Node api 的 WordPress 管理员

node.js - sequelize中如何设置复杂的join条件?

javascript - JavaScript 中的 promise /获取 : how to extract text from text file

grails - Grails-异步 Controller Action

parallel-processing - 如何在 parfor 循环中使用 tic/toc?

parallel-processing - 避免在 OpenShift/Kubernetes 集群中并行处理 pod