ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js でのイベント ループはどのように機能しますか?

Node.js でのイベント ループはどのように機能しますか?

PHPz
PHPzオリジナル
2024-08-17 20:31:37528ブラウズ

How event loop work in Node.js?

イベント ループは、非同期操作を効率的に処理できるようにする 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() によってスケジュールされたコールバックを実行します。
    • コールバックを閉じるフェーズ:socket.on('close') によって発行されるクローズ イベントなどを処理します。
  • 再確認して終了: イベント ループに処理するタスクがなくなった場合は終了し、プログラムを終了できます。まだ保留中のタスクがある場合は、実行を継続します。

4. コールバックキュー

非同期タスクは完了すると、コールバックをキューにプッシュします。イベント ループはこれらのコールバックをキューから選択し、順番に実行します。

5. マイクロタスクキュー (次のティック)

メイン キューとは別に、process.nextTick() または Promise の .then() ハンドラーでスケジュールされたコールバックがキューに入れられるマイクロタスク キュー (または次のティック キュー) もあります。マイクロタスクは通常のコールバックよりも優先されます。つまり、現在の操作が完了した後、イベント ループが次のフェーズに進む前に実行されます。

イベント ループがどのように機能するかを示す簡単な例を次に示します。

const fs = require('fs');

console.log('Start');

fs.readFile('file.txt', (err, data) => {
  if (err) throw err;
  console.log('File read complete');
});

console.log('End');

出力:

Start
End
File read complete

説明:

  1. console.log('開始');そして console.log('終了');同期的に実行されます。
  2. fs.readFile は、非同期ファイル読み取り操作を開始し、待機せずにコードの次の行の実行を続けます。
  3. ファイル読み取り操作が完了すると、そのコールバック (console.log('File read complete');) がイベント ループのコールバック キューにプッシュされます。
  4. イベント ループは、同期コードの実行が完了した後にコールバックを処理します。

イベント ループを使用すると、Node.js はシングルスレッドであるにもかかわらず、操作をシステムに委任し、その結果を非同期的に処理することで、一度に多くの操作を効率的に処理できます。

イベント ループはタスクの実行を調整し、マイクロタスク キューに優先順位を付けて、メイン タスク キューのタスクに進む前に Promise と関連操作が迅速に解決されるようにします。 (マクロタスク)。

このダイナミックにより、JavaScript はシングルスレッド環境で複雑な非同期動作を処理できるようになります。

以上がNode.js でのイベント ループはどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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