在完成功能后杀死node.js工作者

fnx*_*fnx 6 multithreading multiprocessing node.js

我是一个总节点.刚刚开始修补它的新手.我有一段代码执行一个处理所有cpu核心上的字符串的函数,我希望确定哪个worker首先通过它的id完成了该函数,然后杀死每个worker(或者只是退出节点).

这是我的程序的简化代码:

var cluster = require('cluster'),
    cpus = require("os").cpus().length, // 4 cores
    myArray = ["foo","bar","baz","qux"]; // 1 string per core

if (cluster.isMaster) {
    for (var i = 0; i < cpus; i++) {
        var worker = cluster.fork();
    }
    cluster.on('exit', function(worker, code, signal) {
        console.log('worker ' + worker.process.pid + ' died');
    });
} else if (cluster.isWorker) {
    computeString(myArray[cluster.worker.id]);
}

function computeString() {
    // Code to compute...
}
Run Code Online (Sandbox Code Playgroud)

这段代码有效,而computeString()函数的完成速度比在外部执行它要快得多

else if (cluster.isWorker) {}
Run Code Online (Sandbox Code Playgroud)

所以问题是在一个工作者/进程完成该功能之后,节点等待直到每个进程完成了他们的工作并且在这些进程之后没有终止,每个进程都保持空闲直到我按下ctrl + c.

我的方法是:

function computeString() {
    // Code to compute...
    if (done) {
         console.log("Worker #" + cluster.worker + " completed the task!");
         for (var id in cluster.workers) {
            cluster.workers[id].kill();
         }
     }
}
Run Code Online (Sandbox Code Playgroud)

但既然我在这里问,它显然不起作用:)

rob*_*lep 9

所以当第一个工人完成工作时你想要杀死所有工人?

...
cluster.on('exit', function(worker, code, signal) {
  console.log('worker ' + worker.process.pid + ' died');
  // kill the other workers.
  for (var id in cluster.workers) {
    cluster.workers[id].kill();
  }
  // exit the master process
  process.exit(0);
});
...
function computeString() {
  // Code to compute...
  if (done) {
    process.exit(0); // exit the worker process cleanly, triggering the 'exit' event
  }
};
Run Code Online (Sandbox Code Playgroud)