热门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/