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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top