イベントループがどのようにして動作しているかを理解するために、簡単にイベントループの流れの説明を行う。
イベントループの処理は、大まかに5つのステップに分かれている。
1 setTimeout()のコールバック実行
2 process.nextTick()のコールバック実行(メインモジュールの実行)
3 I/Oイベントの発生
4 I/Oイベントのコールバック実行
5 process.nextTick()のコールバック実行
以上5つのステップを繰り返すことでイベントループ機能が成り立っている。
この中でも、3はOSのカーネル上で行うステップであり、
1,2,4,5がnodeにおいてjavascriptが実行されるステップである。
これより、各ステップにおける解説を行う。
1 setTimeout()のコールバック実行
指定された時間以上経過していると、setTimeoutのコールバックが実行される
setInterval()のコールバック関数も同様にここで実行される。
2 process.nextTick()のコールバック実行(メインモジュールの実行)
ユーザからみた場合のプログラム上のイベントループの起点がこのステップである。
process.nextTick()とは、3のI/Oイベントが発生する前にコールバックが必ず
実行されることを保証するAPIである。
ユーザ作成のメインモジュールがnodeの引数として実行された場合、このステップで
実行される。
個人的には、ここが一番疑問に思っている点でまだ理解が足りない点である。
3 I/Oイベントの発生
ここでは一時的にイベントループが停止して、OSがイベントを待ち受ける。
OSがイベントを検知したら、イベントループが再び回り始めて次の処理に進む。
setTimeout()等のタイマーが登録されていたらその時間までイベントを待ち続ける。
このステップに達する前に、イベントを待つAPIが実行されていなかったらこのステッ プはスキップされる
4 I/Oイベントのコールバック実行
検知したイベントに登録されたコールバック関数の実行を行う。
メインモジュールの実行後、イベントのコールバック関数を実行する処理が中心とな る。そのため、このステップが主なjavascriptの実行ステップである。
5 process.nextTick()のコールバック実行
3、4でのイベントのコールバック実行完了後に直ちに実行される。
1〜5のステップの後、各ステップで行う処理が登録されていなければ次のイベントループにいかず、終了する。
終了後、最後にプロセスの終了時に行うexitイベントのリスナを実行し、nodeプロセスが終了する。