是否有等效的异步库,但对于node.js的child_processes

时间:2014-07-03 21:36:11

标签: node.js asynchronous parallel-processing

节点中流行的async库在处理节点中异步函数的许多复杂控制结构方面做得很好。例如,假设我有一系列银行帐户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(在网络请求的形式)是该计划的限制因素。

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

2 个答案:

答案 0 :(得分:2)

我认为应该可以使用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 These child Nodes are still whole new instances of V8. Assume at least 30ms startup and 10mb memory for each new Node. That is, you cannot create many thousands of them.

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

答案 1 :(得分:0)

对于特定情况,可能存在为Node构建的音频转换库。否则,您可以使用lame命令转换音频,但这意味着与shell命令交互的复杂性。

一般来说,设置一个暴露类似REST的URL的Express服务器很容易。

app.get('/path/:param', function(req, res, next) { CPUintensiveCalc(req.params.param, function(err, result) { res.send({ result: result}); }); });

然后在另一个Node.js应用程序中,您可以使用http.request来调用该服务。

我在这里写了一个较长的回复:http://davidherron.com/blog/2014-07-03/easily-offload-your-cpu-intensive-nodejs-code-simple-express-based-rest-server

相关问题