Worker
無期限にループする必要がある in javascript を作成しました。ループ内では、いくつかの非同期呼び出しを行い、それらが完了するのを待ってから続行する必要があります。
これを行うには 2 つの直接的な方法がありますが、どちらも致命的な欠陥があるように思われます。
1)
while(true) {
var promise = async_call();
while(!promise.isResolved()) { }
}
2)
var func = function() {
var promise = async_call();
promise.done(func);
}
func();
while
#1 の場合、内側のループが大量の CPU を消費する可能性があるため、バラバラになります。スレッドが中断可能でない場合 (javascript スレッドは中断可能ですか?私はそうは思いません)、async_call
実際に完了する機会が得られないため、ループに陥ってしまいます。
#2については、テールコールの最適化があればうまくいきますが、これを採用しているJavaScript実装はないと思うので、スタックオーバーフローやその他の再帰制限がすぐに発生します.
最後に、終了する必要があるときに両方のループに通知する方法が必要です。これは、ブール変数をコードに入れることで簡単に実行できますが、これstop
もワーカー スレッドが割り込み可能であることに依存しているため、stop
true に設定できます。
私が見落としていたり、見慣れていないデザイン パターンはありますか? setInterval
polling と組み合わせたようなものに頼らずに、ワーカーをできるだけ速く実行するにはどうすればよいisResolved
ですか?