2013-03-21 9 views
5

Ich bin ein total node.js Neuling, der gerade damit begonnen hat, daran zu basteln. Ich habe ein Stück Code, der eine Funktion ausführt, die Zeichenfolgen auf allen CPU-Kernen verarbeitet, und ich möchte bestimmen, welcher Arbeiter die Funktion zuerst durch seine ID abgeschlossen hat, und danach jeden Arbeiter töten (oder einfach den Knoten verlassen).Killing node.js Arbeiter nach der Funktion ist fertig

Hier ist der vereinfachte Code meines Programms:

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

Dieser Code funktioniert, und die computeString() Funktion beendet viel schneller, als es außerhalb des dass

else if (cluster.isWorker) {} 

So das Problem der Ausführung ist nach Ein Arbeiter/Prozess vervollständigt die Funktion, der Knoten wartet, bis jeder Prozess seine Arbeit erledigt hat und endet nicht danach, jeder Prozess bleibt im Leerlauf, bis ich ctrl + c drücke.

Mein Ansatz war:

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(); 
     } 
    } 
} 

Aber da frage ich hier, es offensichtlich nicht funktioniert :)

Antwort

7

Sie wollen also alle Arbeiter töten, wenn der erste Arbeiter seine Arbeit getan hat ?

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

meinem Fall i töten wollen und Arbeiter nacheinander neu starten, wenn eine Bedingung erfüllt wird, Schuppen bitte kein Licht an diesem – mithra

+0

@mithra dies über den genauen Anwendungsfall abhängt. Vielleicht erstellen Sie eine neue Frage, in der Sie genau beschreiben, was Sie erreichen möchten. – robertklep

Verwandte Themen