提案:
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
コールバックで発生します。作業者がメッセージで応答するたびに、すべての作業者のfinished
プロパティがtrue
に設定されているかどうかをチェックして、simulator.workers
アレイを検査します。そうであれば、これはすべての労働者が作業を終え、あなたが進めることができることを意味します(「生き残ったfor-loop」の部分)。
基本的に、すべてのワーカーをインスタンス化してから、応答を待つだけです...ループは必要ありません。
Webワーカーのアイデアは、バックグラウンドで実行させ、終了時にハンドラ(=コールバック)を実行させることです。 whileループ(UIをブロックする)を使用すると、Webワーカーの目的はすべて失われます。 –
各繰り返しで新しいワーカーセットを作成していますか?すべての反復で同じ組の労働者を再使用できませんでしたか? –
私はシミュレータをC#からJavascriptに移行しているので、多分改善することができます。私はワーカーを再利用しようとしますが、UIをブロックするwhileループを削除する方法についてはまだ考えています。ありがとう。 –