kakts-log

programming について調べたことを整理していきます

node イベントループの詳細

イベントループがどのようにして動作しているかを理解するために、簡単にイベントループの流れの説明を行う。

イベントループの処理は、大まかに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プロセスが終了する。