在消息上宣传集群工作者事件

时间:2016-07-12 23:14:09

标签: javascript node.js performance es6-promise

我正试图找到一种方法来“宣传”工人的事件回调,以便主人可以:

  1. 等待所有工作人员完成CPU密集型任务,
  2. 然后根据返回的结果进行一些计算。
  3. 我想出了以下代码,这很好用,但我对我采取的方法没有信心。

    创建一个将消息事件包装在worker上的promise的函数:

     _waitAsync(worker) {
        // using bluebird for Promise
        return Promise.promisify((callback) => {
          worker.on('message', callback.bind(undefined, undefined));
        })();
      }
    

    主要电话如下:

    doCPUIntensiveTaskAsync(){
        const promises = [];
        let k = 0;
        for (var wid in cluster.workers) {
          promises.push(this._waitAsync(cluster.workers[wid]).bind(this));
          cluster.workers[wid].send(messages[k++]);
        }
        return Promise.all(promises).then(calulcate);
    }
    

    在Node.js中,有哪些推荐/更好的方法可以利用多核环境(即将CPU密集型任务卸载到不同的线程/进程)?

1 个答案:

答案 0 :(得分:0)

  1. 每个“ CPU密集型任务”启动工作程序,然后让它们退出。不要重复使用工作程序,请重新启动它们以执行下一个任务。

  2. 简化工作人员退出的方法:

    import * as Q from 'q';
    
    let worker = cluster.fork();
    let workerExit = Q.denodeify(w.on.bind(w, 'exit'));
    await workerExit();// here can be workerExit().then ... instead of await
    
    console.log('child exited');