この記事では、node.js のイベント ループを紹介し、イベント ループ モデル、イベント ループのさまざまな段階を見て、イベント ループに関する 2 つのインタビューの質問を共有します。見てください、見てください!
JavaScript エンジン自体はイベント ループ メカニズムを実装しません。ブラウザのイベント ループはブラウザによって実装され、NodeJS のイベント ループは主に基盤となる Libuv ライブラリによって実装されます。
Libuv ライブラリはイベント駆動型であり、さまざまなプラットフォーム上の API 実装をカプセル化して統合します。 NodeJS のクロスプラットフォームおよびイベント ループ メカニズムは、Libuv ライブラリを通じて実装されます。 [推奨学習: "nodejs チュートリアル "]
上記は 4 つのステップに分かれています:
1. NodeJS の V8 エンジンの解析JavaScript コードを入力し、Node API
2 を呼び出します。NodeAPI は、処理のためにタスクを Libuv ライブラリに割り当てます。
3. Libuv は、イベント ループ メカニズムを通じてこれらのタスクの実行を管理し、戻り値を返しますその成果をV8エンジンに。
4. V8 エンジン コールバック処理 Libuv が返す
タスク タイプ、マイクロ タスク キュー、およびマクロ タスクに応じて異なるタスク キューを分割します。マクロタスクキュー。
マクロ タスク: setTimeout、setInterval、setImmediate
マイクロ タスク: Promise.then()、Promise.catch()、process.nextTick()
各ステージは、現在のステージのタスク キューを実行し、その後、現在のステージのマイクロタスク キューを実行します。すべてのマイクロタスクが実行された後にのみ実行されます。次のステージへのエントリーになります。
ブラウザのイベント ループの違い:
ブラウザには複数のステージはありません。優先レベル: 同期コード、マイクロ タスク、マクロ タスク
ブラウザでは、マクロ タスクのキューが複数ある場合がありますが、マイクロ タスクは 1 つだけです。毎回、最初にマイクロ タスクが実行され、次にマクロ タスクが実行されます
主に学習した NodeJS イベント ループ モデルは、V8 エンジンから JS コードを解析し、NodeAPI を呼び出します。NodeAPI は、実行のために基礎となる Libuv ライブラリにタスクを割り当てます。メイン イベントループ メカニズムはすべて Libuv ライブラリによって制御されます。
イベント ループ全体は、タイマー ステージ、保留コールバック ステージ、ポーリング ステージ、チェック ステージ、クローズ コールバック ステージの 6 つのステージに分かれており、実行順序は次のとおりです: 各ステージのタスク キューが実行された後、マイクロプロセッサが実行されます。タスク、次のステージはマイクロタスクの実行が完了した後にのみ実行されます。ブラウザのイベント ループはステージに分割されておらず、優先順位は同期コード、マイクロタスク、マクロタスクの順です。
質問 1: NodeJS のイベント ループについてどのように理解していますか?
回答: イベント ループについての私の理解は、ノードがシングルスレッドであるということです。メイン スレッドはすべてのタスクを循環キューに入れ、その後、基礎となる libuv ライブラリが循環イベントからタスクを取り出します。キューに割り当てて別のスレッドで処理し、メインスレッドも同時にコールバック処理を行い、プロセス全体がイベントループを形成します。
ブラウザ イベント ループとの違い:
1. ブラウザは複数のステージに分かれていません
2. ブラウザ タスクの優先順位: 同期コード、マイクロ タスク、マクロ タスク
質問 2: イベント キュー内のタスクの実行順序は何ですか?
回答: NodeJS イベント ループは複数のステージに分割されており、実行シーケンスは次のとおりです: 1 つのステージが完了した後、マイクロタスクが実行され、次に次のステージが実行されます。
プログラミング関連の知識について詳しくは、プログラミング入門をご覧ください。 !
以上がNode.js のイベント ループを 1 つの記事で理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。