我正在开发一个在Web浏览器中运行的Javascript模拟器。它有一个主循环:
do {
updateVisualization(simulator);
simulator.doStep();
} while (!reachedGoal(simulator));
对于每次迭代,我都需要运行几个必须同时执行的worker:
doStep = function() {
...
for (every agent in the simulation) {
var worker = new Worker('worker.js');
worker.onmessage = function(event) {
...
}
worker.postMessage(...);
}
// Here is the problem
}
我的问题是:我怎么能等待每个工人完成?
答案 0 :(得分: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
属性设置为finished
来检查true
数组。如果是这种情况,这意味着所有工人都完成了,你可以继续前进(“幸存的for-loop”部分)。
所以基本上,你实例化所有工人,然后等待他们的回答......不需要循环。