Node.jsのイベントループ

「for やめろ」またはイベントループと nextTick() - Block Rockin’ Codes

Node.jsはイベントのキューにイベントがあったら処理をする。

そしてイベントのキューにタスクがあるかどうかの確認でループし続けている(=ノンブロッキング)

イベントのキューにはIO用、setTimeout/setInterval用、setImmediate用、などの種類がある。この円の上にあるキューはlibuvで実装されていて、真ん中はnode.jsのもの。

f:id:namaza:20170807234912p:plain

Timers, Immediates and Process.nextTick— NodeJS Event Loop Part 2

 

流れとしては、キューを移動する前にnext tickキューを確認し、それが空になるまで処理し、空になったら移動する。タスク数の制限がないので注意が必要。
つまり、

開始
→next tick
→timers
→next tick
→IO
→next tick
→immediates
→next tick
→close handle

のように、毎回next tickをはさんで遷移する。

next tickにはタスク数の制限がないので、このコードは絶対に最後に「!」が出力される。こういった処理によってイベントループが回らなくなってしまう。

for (let i = 0; i < 10000; i++) {
process.nextTick( () => console.log('_'));
}

setImmediate( () => console.log('!'));