Подождите, пока не завершится каждый процесс - PullRequest
2 голосов
/ 09 сентября 2011

Я работаю над симулятором 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
}

Мой вопрос: как мне ждатькаждый рабочий до финиша?

1 Ответ

4 голосов
/ 09 сентября 2011

Предложение:

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, проверяя, установлено ли для всех работников свойство finished, установленное на true.Если это так, это означает, что все работники закончили и вы можете двигаться дальше (часть «выжил для цикла»).

Таким образом, в основном вы создаете экземпляры для всех работников, а затем просто ждете их ответов.. цикл не требуется.

...