2

私は、Web ブラウザーで実行される Javascript シミュレーターに取り組んでいます。メインループがあります:

do {
    updateVisualization(simulator);
    simulator.doStep();
} while (!reachedGoal(simulator));

そして、反復ごとに、同時に実行する必要がある複数のワーカーを実行する必要があります。

doStep = function() {
    ...
    for (every agent in the simulation) {
        var worker = new Worker('worker.js');
        worker.onmessage = function(event) {
            ...
        }
        worker.postMessage(...);
    }

    // Here is the problem
}

私の質問は、すべてのワーカーが終了するのをどのように待つことができるでしょうか?

4

1 に答える 1

4

提案:

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

したがって、すべてのアクションonmessageはワーカーのコールバックで発生します。ワーカーがメッセージで応答するたびに、すべてのワーカーのプロパティが に設定されsimulator.workersているかどうかを確認して、配列を調べます。その場合、これはすべてのワーカーが終了したことを意味し、先に進むことができます (「生き残った for ループ」の部分)。finishedtrue

したがって、基本的には、すべてのワーカーをインスタンス化し、その応答を待つだけです...ループは必要ありません。

于 2011-09-09T15:30:12.533 に答える