7

私はnode.jsの初心者で、いじり始めたばかりです。すべてのCPUコアで文字列を処理する関数を実行するコードがあり、どのワーカーが最初にそのIDで関数を完了し、その後すべてのワーカーを強制終了するか(またはノードを終了するか)を判断したいと思います。

これが私のプログラムの簡略化されたコードです:

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...
}

このコードは機能し、computeString()関数は外部で実行するよりもはるかに高速に終了します。

else if (cluster.isWorker) {}

したがって、問題は、1つのワーカー/プロセスが関数を完了した後、ノードはすべてのプロセスがジョブを完了するまで待機し、その後も終了せず、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();
         }
     }
}

しかし、私はここで尋ねているので、それは明らかに機能しません:)

4

1 に答える 1

11

それで、最初の労働者がその仕事をしたときにすべての労働者を殺したいですか?

...
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
  }
};
于 2013-03-21T14:11:40.737 に答える