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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top