ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js のイベント ループを 1 つの記事で理解する

Node.js のイベント ループを 1 つの記事で理解する

青灯夜游
青灯夜游転載
2021-07-27 09:36:462098ブラウズ

この記事では、node.js のイベント ループを紹介し、イベント ループ モデル、イベント ループのさまざまな段階を見て、イベント ループに関する 2 つのインタビューの質問を共有します。見てください、見てください!

Node.js のイベント ループを 1 つの記事で理解する

イベント ループ モデル

JavaScript エンジン自体はイベント ループ メカニズムを実装しません。ブラウザのイベント ループはブラウザによって実装され、NodeJS のイベント ループは主に基盤となる Libuv ライブラリによって実装されます。

Libuv ライブラリはイベント駆動型であり、さまざまなプラットフォーム上の API 実装をカプセル化して統合します。 NodeJS のクロスプラットフォームおよびイベント ループ メカニズムは、Libuv ライブラリを通じて実装されます。 [推奨学習: "nodejs チュートリアル "]

Node.js のイベント ループを 1 つの記事で理解する

上記は 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()

Eventsサイクルの各ステージ

  • timers ステージ: すべての setTimeout および setInterval コールバックを実行します
  • 保留中のコールバック ステージ: 特定のシステム操作のコールバック。 TCP 接続エラーなど
  • ポーリング フェーズ: 新しいリンク、リクエスト、その他のイベントを待機し、I/O コールバックを実行するポーリング。例: ファイル読み取り操作
  • チェック フェーズ: setImmediate コールバックの実行
  • コールバックを閉じるフェーズ: コールバック実行を閉じる (socket.on( など) close...)

各ステージは、現在のステージのタスク キューを実行し、その後、現在のステージのマイクロタスク キューを実行します。すべてのマイクロタスクが実行された後にのみ実行されます。次のステージへのエントリーになります。

ブラウザのイベント ループの違い:

ブラウザには複数のステージはありません。優先レベル: 同期コード、マイクロ タスク、マクロ タスク

ブラウザでは、マクロ タスクのキューが複数ある場合がありますが、マイクロ タスクは 1 つだけです。毎回、最初にマイクロ タスクが実行され、次にマクロ タスクが実行されます

ステートメントの概要

主に学習した NodeJS イベント ループ モデルは、V8 エンジンから JS コードを解析し、NodeAPI を呼び出します。NodeAPI は、実行のために基礎となる Libuv ライブラリにタスクを割り当てます。メイン イベントループ メカニズムはすべて Libuv ライブラリによって制御されます。

イベント ループ全体は、タイマー ステージ、保留コールバック ステージ、ポーリング ステージ、チェック ステージ、クローズ コールバック ステージの 6 つのステージに分かれており、実行順序は次のとおりです: 各ステージのタスク キューが実行された後、マイクロプロセッサが実行されます。タスク、次のステージはマイクロタスクの実行が完了した後にのみ実行されます。ブラウザのイベント ループはステージに分割されておらず、優先順位は同期コード、マイクロタスク、マクロタスクの順です。

インタビューの質問

質問 1: NodeJS のイベント ループについてどのように理解していますか?

回答: イベント ループについての私の理解は、ノードがシングルスレッドであるということです。メイン スレッドはすべてのタスクを循環キューに入れ、その後、基礎となる libuv ライブラリが循環イベントからタスクを取り出します。キューに割り当てて別のスレッドで処理し、メインスレッドも同時にコールバック処理を行い、プロセス全体がイベントループを形成します。

ブラウザ イベント ループとの違い:

1. ブラウザは複数のステージに分かれていません

2. ブラウザ タスクの優先順位: 同期コード、マイクロ タスク、マクロ タスク

質問 2: イベント キュー内のタスクの実行順序は何ですか?

回答: NodeJS イベント ループは複数のステージに分割されており、実行シーケンスは次のとおりです: 1 つのステージが完了した後、マイクロタスクが実行され、次に次のステージが実行されます。

プログラミング関連の知識について詳しくは、プログラミング入門をご覧ください。 !

以上がNode.js のイベント ループを 1 つの記事で理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。