イベント ループは、非同期操作を効率的に処理できるようにする Node.js の中核的な概念です。これがどのように機能するかを簡単に説明します:
1. シングルスレッドの性質
Node.js はシングルスレッドで動作します。これは、一度に 1 つのコードしか実行できないことを意味します。ただし、Node.js は、複数のスレッドを必要とせずに多くの操作を同時に処理できるように設計されています。
2. ノンブロッキング I/O
Node.js はノンブロッキング I/O 操作を使用します。 Node.js は、ファイルの読み取り、データベースのクエリ、ネットワーク リクエストの作成などのタスクを実行するとき、これらのタスクの完了を待たずに次のタスクに進みます。代わりに、これらのタスクの処理中に他のコードの実行を継続します。
3. イベントループの仕組み
イベント ループは、コードの実行の管理と非同期イベントの処理を担当します。タスクの「キュー」を継続的にチェックし、どれを実行するかを決定します。段階的な内訳は次のとおりです:
- 初期化: Node.js アプリケーションが起動すると、初期化され、環境がセットアップされます。
- 実行フェーズ: Node.js は初期コードを同期的に実行します。非同期タスク (ファイルの読み取りや HTTP リクエストなど) がある場合、それらはシステムの API に渡されます。
- イベント ループ フェーズ: イベント ループには複数のフェーズがあり、各フェーズのタスクが特定の順序で処理されます。
- タイマーフェーズ: setTimeout() および setInterval() によってスケジュールされたコールバックを実行します。
- IO コールバック フェーズ: ファイル読み取りやネットワーク リクエストなどの I/O 操作のコールバックを実行します。
- アイドル、準備フェーズ: システムタスクに使用される内部フェーズ
- ポーリング フェーズ: 新しい I/O イベントを取得し、そのコールバックを実行します。ポーリング キューが空の場合は、setImmediate() キューにコールバックがあるかどうかを確認します。
- チェックフェーズ: setImmediate() によってスケジュールされたコールバックを実行します。
- Close Callbacks フェーズ:socket.on('close') によって発行されるクローズ イベントなどを処理します。
- 再確認して終了: イベント ループに処理するタスクがなくなった場合は終了し、プログラムを終了できます。まだ保留中のタスクがある場合は、実行を継続します。
4. コールバックキュー
非同期タスクは完了すると、コールバックをキューにプッシュします。イベント ループはこれらのコールバックをキューから選択し、順番に実行します。
5. マイクロタスクキュー (次のティック)
メインキューとは別に、process.nextTick() または Promise の .then() ハンドラーでスケジュールされたコールバックがキューに入れられるマイクロタスク キュー (または次のティック キュー) もあります。マイクロタスクは通常のコールバックよりも優先されます。つまり、現在の操作が完了した後、イベント ループが次のフェーズに進む前に実行されます。
例
イベント ループがどのように機能するかを示す簡単な例を次に示します。
リーリー
出力:
リーリー
説明:
console.log('開始');そして console.log('終了');同期的に実行されます。
fs.readFile は、非同期ファイル読み取り操作を開始し、待機せずにコードの次の行の実行を継続します。
ファイル読み取り操作が完了すると、そのコールバック (console.log('File read complete');) がイベント ループのコールバック キューにプッシュされます。
イベント ループは、同期コードの実行が完了した後にコールバックを処理します。
イベント ループを使用すると、Node.js はシングルスレッドであるにもかかわらず、操作をシステムに委任し、その結果を非同期的に処理することで、一度に多くの操作を効率的に処理できます。
イベント ループ
はタスクの実行を調整し、
マイクロタスク キュー
を優先して、メイン タスク キュー(マクロ タスク) のタスクに進む前に、Promise と関連操作が迅速に解決されるようにします。このダイナミックにより、JavaScript はシングルスレッド環境で複雑な非同期動作を処理できるようになります。
以上がNode.js でのイベント ループはどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。