Node.JS で setTimeout はどのように機能しますか? 質問する

Node.JS で setTimeout はどのように機能しますか? 質問する

一度実行されるとキューに入れられると思いますが、キュー内で正確に X ミリ秒後に呼び出されるという保証はありますか? または、キューの上位にある他の重いタスクによって遅延されますか?

ベストアンサー1

setTimeoutのセマンティクスはウェブブラウザとほぼ同じです。タイムアウト引数は最小実行前に待機するミリ秒数であり、保証されるものではありません。さらに、0、数値以外、または負の数値を渡すと、最小ミリ秒数待機することになります。Node ではこれは 1 ミリ秒ですが、ブラウザでは最大 50 ミリ秒になることがあります。

その理由は、JavaScript による JavaScript のプリエンプションがないためです。次の例を考えてみましょう。

setTimeout(function () {
  console.log('boo')
}, 100)
var end = Date.now() + 5000
while (Date.now() < end) ;
console.log('imma let you finish but blocking the event loop is the best bug of all TIME')

ここでの流れは次のとおりです。

  1. タイムアウトを 100 ミリ秒にスケジュールします。
  2. 5000msの間ビジー待機します。
  3. イベント ループに戻ります。保留中のタイマーをチェックして実行します。

そうでない場合は、JavaScript の 1 つのビットが別のビットを「中断」する可能性があります。次のようなコードが極めて理解しにくいものにならないように、ミューテックスやセマフォなどを設定する必要があります。

var a = 100;
setTimeout(function () {
  a = 0;
}, 0);
var b = a; // 100 or 0?

Node の JavaScript 実行はシングルスレッドであるため、他のほとんどの同時実行スタイルよりも操作がはるかに簡単です。もちろん、トレードオフとして、プログラムの動作が不適切な部分によって、無限ループで全体がブロックされる可能性があります。

これは、先制攻撃の複雑さよりも戦うのに適した悪魔でしょうか? それは状況によります。

おすすめ記事