Espere hasta que termine cada proceso
-
28-10-2019 - |
Pregunta
Estoy trabajando en un simulador JavaScript que se ejecuta en un navegador web. Tiene un bucle principal:
do {
updateVisualization(simulator);
simulator.doStep();
} while (!reachedGoal(simulator));
Y para cada iteración, necesito administrar varios trabajadores que deben ser ejecutados simultáneamente:
doStep = function() {
...
for (every agent in the simulation) {
var worker = new Worker('worker.js');
worker.onmessage = function(event) {
...
}
worker.postMessage(...);
}
// Here is the problem
}
Mi pregunta es: ¿cómo podría esperar a que termine cada trabajador?
Solución
Una sugerencia:
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
}
};
Entonces toda la acción sucede en el onmessage
devolución de llamada de los trabajadores. Cada vez que un trabajador responde con un mensaje, inspecciona el simulator.workers
matriz revisando si todos los trabajadores tienen un finished
propiedad establecida en true
. Si ese es el caso, esto significa que todos los trabajadores terminaron y usted puede seguir adelante (la parte de "sobrevivido para obtener").
Básicamente, instancías a todos los trabajadores y luego solo esperas sus respuestas ... no se requieren bucle.