【发布时间】:2014-07-03 21:36:10
【问题描述】:
node 中流行的 async 库在处理 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));
}
);
这使我不必编写管道来跟踪同时调度了多少异步函数,确保所有函数最终完成,跟踪错误等。此外,它在节点中运行良好,因为 I/O(在web请求的形式)是这个程序的限制因素。
但是,让我们想象一下,我们有受 CPU 限制的单个任务,而不是受 I/O 限制的单个任务。异步不会给我任何真正的性能优势,因为 node.js 只会运行一个主线程。在节点中并行化这种工作负载的一种解决方案可能是使用child_process 库并生成一堆工作进程来处理受 CPU 限制的工作。我的问题是,是否有一个库可以处理这些工作流的管道/协调,就像 async 对 I/O 绑定的异步函数所做的那样?如果没有,这值得写吗?我认为这可能是一个有趣的练习。
【问题讨论】:
标签: node.js asynchronous parallel-processing