はじめに
Node.js は、ノンブロッキングの非同期アーキテクチャで広く知られており、スケーラブルでパフォーマンスの高い Web アプリケーションにとって理想的な選択肢となっています。この機能の背後にある主な理由の 1 つは、イベント駆動型モデルとイベント ループを介したタスクの効率的な処理です。 Node.js の非同期性を理解するには、このシステムを駆動するキューについて詳しく調べる必要があります。興味深いことに、ブラウザーでは主に 2 つのキューが使用されているのに対し、Node.js ではタスク管理に 6 つの異なるキューが使用されています。これらを詳しく見てみましょう。
Node.js の 6 つのキュー
Node.js には、6 つのキューを使用してタスクを処理する高度なメカニズムがあります。
-
タイマーキュー
-
目的: setTimeout と setInterval でスケジュールされたタスクを処理します。
-
例:
setTimeout(() => {
console.log('Timer task executed');
}, 1000);
ログイン後にコピー
ログイン後にコピー
- タイマー キュー内のタスクは、指定された遅延の後に実行されますが、イベント ループの現在のフェーズが完了する前には実行されません。
-
I/O キュー (コールバック キュー)
-
目的: ファイルの読み取りやネットワーク要求の処理など、I/O 関連のタスクを処理します。
-
例:
const fs = require('fs');
fs.readFile('file.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
ログイン後にコピー
- I/O キューにより、I/O 操作が完了するとコールバックが確実に実行されます。
-
キューをチェック
-
目的: setImmediate() を使用してスケジュールされたタスクを実行します。
-
例:
setImmediate(() => {
console.log('Check Queue task executed');
});
ログイン後にコピー
-
注: チェック キューの優先順位はイベント ループ内で最も低いものの 1 つです。このキュー内のタスクは、I/O フェーズの後に処理されます。
-
マイクロタスクキュー
-
目的: 主に Promise やその他のマイクロタスクに関連する、優先度の高いタスクを実行します。
-
サブカテゴリ:
-
a. process.nextTick キュー:
- process.nextTick() でスケジュールされたタスクを処理します。
- このキュー内のタスクには最高の優先度が与えられ、他のマイクロタスクよりも前に実行されます。
-
b.他の Promise 用に別のキュー:
- 解決された Promise に関連するタスクを処理します。
process.nextTick(() => {
console.log('process.nextTick task executed');
});
Promise.resolve().then(() => {
console.log('Promise resolved task executed');
});
ログイン後にコピー
- マイクロタスク キューは、イベント ループの次のフェーズに進む前に、常に完了するまで実行されます。
-
キューを閉じる
-
目的:socket.on('close') イベントなど、終了操作に関連するタスクを処理します。
-
例:
setTimeout(() => {
console.log('Timer task executed');
}, 1000);
ログイン後にコピー
ログイン後にコピー
- クローズ キュー内のタスクは、リソースが明示的に閉じられたときに実行されます。
イベント ループがキューに優先順位を付ける方法
Node.js のイベント ループは、タスクを実行するための特定のフェーズ順序に従います。優先順位は次のとおりです:
-
マイクロタスク キュー (process.nextTick): このキュー内のタスクは常に最初に実行されます。
-
マイクロタスク キュー (Promises): process.nextTick タスクが完了すると、Promises キュー内のタスクが実行されます。
-
タイマー キュー: setTimeout または setInterval でスケジュールされたタスクは、このフェーズで処理されます。
-
I/O キュー: 完了した I/O 操作を処理します。
-
Check Queue: setImmediate からタスクを実行します。
-
Close Queue: プロセスはリソースのコールバックを閉じます。
ブラウザとの比較
対照的に、ブラウザにはプライマリ キューが 2 つだけある、より単純なイベント ループ モデルがあります。
-
マクロ タスク キュー: setTimeout、setInterval、DOM イベントなどのタスクを処理します。
-
マイクロタスク キュー: Node.js と同様に、このキューは解決された Promises や MutationObserver コールバックなどのタスクを処理します。
Node.js の追加キューにより、より多様なタスクを処理できるようになり、サーバー側アプリケーションにより適したものになります。
重要な洞察
参照:-
- https://frontendmasters.com/courses/servers-node-js/
以上が知っておくべきNode.jsのキューの主な種類の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。