在消息上承诺群集工作线程事件

Promisify cluster worker events on message

本文关键字:工作 线程 事件 群集 承诺 消息      更新时间:2023-09-26

我正在尝试找到一种方法来"承诺"对工人的事件回调,以便主人可以:

  1. 等待所有工作线程完成 CPU 密集型任务,
  2. 然后根据返回的结果进行一些计算。

我想出了以下代码,这工作正常,但是我对我正在采取的方法没有信心。

创建将消息事件包装在工作线程上的承诺的函数:

 _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. 每个"CPU 密集型任务"启动工作线程,然后让它们退出。不要重复使用工作线程,在下一个任务中重新启动它们。

  2. 承诺
  3. 工人退出的简单方法:

    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');