Javascript 在消息上提示群集工作程序事件

Javascript 在消息上提示群集工作程序事件,javascript,node.js,performance,es6-promise,Javascript,Node.js,Performance,Es6 Promise,我试图找到一种方法来“允诺”工人的事件回调,以便主控可以: 等待所有工人完成CPU密集型任务 然后根据返回的结果进行一些计算 我提出了下面的代码,它工作得很好,但是我对我正在采取的方法没有信心 函数来创建一个承诺,该承诺将消息事件包装到工作进程上: \u waitAsync(工作者){ //用蓝鸟作承诺 返回承诺。承诺((回调)=>{ worker.on('message',callback.bind(未定义,未定义)); })(); } 船长呼叫如下: docpuvetaskasync(){

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

  • 等待所有工人完成CPU密集型任务
  • 然后根据返回的结果进行一些计算 我提出了下面的代码,它工作得很好,但是我对我正在采取的方法没有信心

    函数来创建一个承诺,该承诺将消息事件包装到工作进程上:

    \u waitAsync(工作者){
    //用蓝鸟作承诺
    返回承诺。承诺((回调)=>{
    worker.on('message',callback.bind(未定义,未定义));
    })();
    }
    
    船长呼叫如下:

    docpuvetaskasync(){
    常量承诺=[];
    设k=0;
    for(cluster.workers中的var wid){
    promises.push(this._waitAsync(cluster.workers[wid]).bind(this));
    cluster.workers[wid].send(messages[k++]);
    }
    返回承诺。全部(承诺)。然后(计算);
    }
    
    利用Node.js中的多核环境(即将CPU密集型任务卸载到不同的线程/进程)有哪些推荐/更好的方法

  • 每个“CPU密集型任务”启动工作进程,然后让它们退出。不要重用工作线程,重新启动它们以执行下一个任务

  • 保证员工退出的简单方法:

    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');
    
  • 每个“CPU密集型任务”启动工作进程,然后让它们退出。不要重用工作线程,重新启动它们以执行下一个任务

  • 保证员工退出的简单方法:

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

  • 如果
    worker
    可以在其生命周期内发送多条
    消息
    ,那么您将成为孤立事件处理程序,它们将累积。孤立事件处理程序将只是试图解决一个已经解决的承诺,但这并不是一个好的做法,因为事件处理程序可以无限期地构建,并且它可以使您的承诺不会被垃圾收集。@jfriend00谢谢,是的,我的工作人员在其一生中将收到多条消息。如果是这种情况,您认为在
    \u waitAsync
    中分配新事件侦听器之前,每次调用
    worker.removeAllListeners('message')
    都会改进代码吗?一般来说,我不喜欢这种体系结构。承诺与事件侦听器不匹配-在一次性承诺设备和重复事件侦听器之间存在阻抗不匹配。我必须更多地了解您的总体代码,才能知道最好的方法是什么。如果
    worker
    可以在其生命周期内发送多条
    消息,那么您将成为孤立事件处理程序,它们将不断累积。孤立事件处理程序将只是试图解决一个已经解决的承诺,但这并不是一个好的做法,因为事件处理程序可以无限期地构建,并且它可以使您的承诺不会被垃圾收集。@jfriend00谢谢,是的,我的工作人员在其一生中将收到多条消息。如果是这种情况,您认为在
    \u waitAsync
    中分配新事件侦听器之前,每次调用
    worker.removeAllListeners('message')
    都会改进代码吗?一般来说,我不喜欢这种体系结构。承诺与事件侦听器不匹配-在一次性承诺设备和重复事件侦听器之间存在阻抗不匹配。我必须了解更多的整体代码,才能知道最好的方法是什么。