ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js イベントキューにはいくつかのステージがあります

Node.js イベントキューにはいくつかのステージがあります

青灯夜游
青灯夜游オリジナル
2021-12-09 17:55:152246ブラウズ

node.js イベント キューには 6 つのステージがあります: 1. 「タイマー」ステージ; 2. 「I/O コールバック」ステージ; 3. 「アイドル、準備」ステージ; 4. 「ポーリング」ステージ; 5 「チェック」ステージ; 6. 「コールバックを閉じる」ステージ。

Node.js イベントキューにはいくつかのステージがあります

#このチュートリアルの動作環境: Windows7 システム、nodejs バージョン 12.19.0、DELL G3 コンピューター。

Node のイベント キューはブラウザーのイベント キューとは大きく異なりますが、共通点は、マクロ タスクとマイクロ タスクの図に示すように、マクロ タスクとマイクロ タスクのメカニズムが同じであるということです。ノードの分類。


Node.js イベントキューにはいくつかのステージがあります nexttick は、ノードの各イベントが開かれたときに最初に実行されます (マイクロタスクの優先度が最も高い)。

ノード イベント キューは次の 6 つのステージに分割できます:
Node.js イベントキューにはいくつかのステージがあります

1. タイマー ステージ: このステージはタイマー (setTimeout、setInterval) を実行します。 ) コールバック

#2. I/O コールバック ステージ: ネットワーク通信エラー コールバックなど、一部のシステム コール エラーを実行します。コールバック

#3. アイドル、準備ステージ: ノード

# によって内部的にのみ使用されます。 ##4. ポーリング フェーズ: 新しい I/O イベントを取得します。適切な条件下では、ノードはここでブロックします。

5. チェック フェーズ: setImmediate() のコールバックを実行します。

6. 閉じるコールバック ステージ: ソケットのクローズ イベント コールバックを実行します。

日常の開発におけるほとんどの非同期タスクは、これら 3 つのステージで処理されるため、タイマー、ポーリング、チェックの 3 つのステージに焦点を当てましょう。

タイマー フェーズ

タイマーはイベント ループの最初のフェーズです。ノードは期限切れのタイマーがあるかどうかを確認し、期限切れのタイマーがある場合はコールバックを抑制します。実際、ノードによるタイマーの有効期限チェックは必ずしも信頼できるものではなく、また、実行中の他のプログラムの影響を受けるため、ノードは事前に設定された時間に達したときにすぐにタイマーが実行されることを保証できません。マシン、またはその時点でメインスレッドがアイドル状態ではありません。たとえば、次のコードでは、setTimeout() と setImmediate() の実行順序は不定です。

setTimeout(() => {
  console.log('timeout')}, 0)setImmediate(() => {
  console.log('immediate')})
上記のコードは大きな落とし穴です。ノードは毎回イベント キューが確立される特定の時間を決定できません。今回は 5 ミリ秒である可能性があります (タイマーはスタックにプッシュされ、それまで実行されません)次回は 1ms です (タイマーは最初のラウンドでキャプチャされ実行されます)。したがって、出力結果の順序は不確実であり、これが具体的な理由でもありますが、非同期操作がネストされてラップされている場合、即時操作が最初に実行されることが 100% 保証されます。

fs.readFile('./index.html',(err,result)=>{
	setTimeout(() => {
	  console.log('timeout')
	}, 0)
	
	setImmediate(() => {
	  console.log('immediate')
	})})

これは、タイマーが最初のラウンドでキャプチャされないためで、io コールバックをキャプチャするためにポーリング ステージに直接進みます。io が終了してチェック ステージに入ると、即時が実行され、 2ラウンド目ではタイムアウトが実行され、ラウンド開始時のタイマーが実行されます。

ポーリング フェーズ

ポーリング フェーズには主に 2 つの機能があります。 1. ポーリング キュー内のイベントを処理します。 2. ポーリング キュー内のイベントを処理します。有効期限が切れています。コールバック関数

を実行すると、キューが空になるか、実行されたコールバックがシステムの上限 (上限は不明) に達するまで、偶数ループはポーリング キュー内のコールバックを同期的に実行します。 setImmediate() には 2 つの状況があります:

1. プリセット setImmediate() がある場合、イベント ループはポーリング フェーズを終了してチェック フェーズに入り、実行します。チェック フェーズのタスク キュー

2. プリセット setImmediate() がない場合、イベント ループはこの段階でブロックされ、待機します。

詳細については注意してください。setImmediate() がないと、イベントはループはポーリング段階でブロックされるため、以前に設定されたタイマーは実行できなくなります。したがって、ポーリング フェーズ中に、イベント ループにはタイマー キューが空かどうかをチェックするチェック メカニズムがあり、タイマー キューが空でない場合、イベント ループは次のラウンドのイベント ループを開始します。タイマーフェーズ。


チェックフェーズ

setImmediate() のコールバックがチェックキューに追加されます。イベントループステージ図から、チェックフェーズはポーリングフェーズの後にあります。

概要

ノード 各大きなイベント ループは 6 つのシーンに分割されており、各シナリオは順番に実行する必要があります。はブラウザよりも詳細で、マクロタスクとマイクロタスクが各段階で処理されるのが特徴です。

1. Node.js のイベントループは 6 つのステージに分かれています

2. マイクロタスクのタスクキューの実行タイミングはブラウザと Node 環境で異なります Node.js では、イベント ループのさまざまなステージ間でマイクロタスクが実行されます

ブラウザ側では、イベント ループのマクロタスクが実行された後にマイクロタスクが実行されます

3. プロセス .nextTick() を再帰的に呼び出すと、I/O 枯渇が発生します。setImmediate()

4 を使用することが公式に推奨されます。Nexttick は、各イベント ステージのマイクロタスクの中で最も高い優先度を持ちます。

ノード関連の知識の詳細については、

nodejs チュートリアル

を参照してください。 !

以上がNode.js イベントキューにはいくつかのステージがありますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。