Aspetta che ogni processo finisca
-
28-10-2019 - |
Domanda
Sto lavorando a un simulatore JavaScript che funziona in un browser Web. Ha un ciclo principale:
do {
updateVisualization(simulator);
simulator.doStep();
} while (!reachedGoal(simulator));
E per ogni iterazione, devo eseguire diversi lavoratori che devono essere eseguiti contemporaneamente:
doStep = function() {
...
for (every agent in the simulation) {
var worker = new Worker('worker.js');
worker.onmessage = function(event) {
...
}
worker.postMessage(...);
}
// Here is the problem
}
La mia domanda è: come potrei aspettare che ogni lavoratore finisca?
Soluzione
Un consiglio:
doStep = function () {
var i, worker;
updateVisualization( simulator );
simulator.workers = []; // array of workers for this step
for ( i = 0; i < agents.length; i++ ) {
// set up new worker
worker = new Worker( 'worker.js' );
worker.onmessage = function ( e ) {
var i;
if ( e.data === 'finished' ) {
this.finished = true;
for ( i = 0; i < simulator.workers.length; i++ ) {
if ( !simulator.workers[i].finished ) {
return;
}
}
// survived for-loop = all workers finished
if ( !reachedGoal( simulator ) ) { // another iteration?
simulator.doStep();
}
}
};
worker.postMessage( 'doStep' );
simulator.workers.push( worker ); // push worker into workers array
}
};
Quindi tutta l'azione avviene in onmessage
callback dei lavoratori. Ogni volta che un lavoratore risponde con un messaggio, ispeziona il simulator.workers
Array controllando se tutti i lavoratori hanno un file finished
Proprietà impostata su true
. In tal caso, ciò significa che tutti i lavoratori hanno finito e puoi andare avanti (la parte "sopravvissuta per loop").
Quindi, fondamentalmente, a istanziare tutti i lavoratori e poi aspettare le loro risposte ... nessun ciclo richiesto.