2013-03-21 4 views
5

나는 방금 node.js 초보자를 만지작 거리며 시작했다. 나는 모든 CPU 코어에서 문자열을 처리하는 함수를 실행하는 코드를 가지고 있는데, 어떤 작업자가 먼저 ID로 함수를 완료했는지 확인한 다음 모든 작업자 (또는 그냥 노드를 종료)를 죽이려고합니다.함수가 끝난 후 node.js 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... 
} 

이 코드는 작동하고, 그래서 문제가 있다는 것입니다 computeString() 함수는

else if (cluster.isWorker) {} 

외부에서 실행보다 훨씬 빠르게 완료 후 하나의 작업자/프로세스가 기능을 완료하면 노드는 모든 프로세스가 작업을 완료 할 때까지 대기하고 그 후에도 종료하지 않고 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(); 
     } 
    } 
} 

그러나 내가 여기 부탁 해요 때문에, 그것은 분명히 작동하지 않습니다 :)

답변

7

을 최초의 노동자가 작업을 할 때 그래서 당신은 모든 노동자를 죽이고 싶어 ?

... 
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 
    } 
}; 
+1

내가 죽이고 조건이 true가 될 때 하나 노동자를 다시 시작하려는 내 경우, 이것은 정확한 사용 사례에 따라 달라집니다 – mithra

+0

@mithra에 어떤을 밝혀주십시오. 아마도 당신이 성취하고자하는 바를 정확히 설명하는 새로운 질문을 만드십시오. – robertklep

관련 문제