Node.js イベントループ


ブロッキング操作の例

let loop = (i, max) => {
  while (i < max) i++
  return i
}

// This operation will block Node.js
// Because, it's CPU-bound
// You should be careful about this kind of code
loop(0, 1e+12)

非ブロッキングIO操作の例

let i = 0

const step = max => {
  while (i < max) i++
  console.log('i = %d', i)
}

const tick = max => process.nextTick(step, max)

// this will postpone tick run step's while-loop to event loop cycles
// any other IO-bound operation (like filesystem reading) can take place
// in parallel
tick(1e+6)
tick(1e+7)
console.log('this will output before all of tick operations. i = %d', i)
console.log('because tick operations will be postponed')
tick(1e+8)

イベントループダイアグラム

簡単に言えば、Event Loopは、実行を終了するまでCPUバインドコードを実行し、IOブロックコードを非ブロッキング形式で実行するシングルスレッドキューメカニズムです。

しかし、カーペットの下にあるNode.jsは、 libuvライブラリを通して、その操作のいくつかのためにマルチスレッドを使用します。

パフォーマンスに関する考慮事項

  • ノンブロッキング操作はキューをブロックせず、ループのパフォーマンスに影響を与えません。
  • ただし、CPUバウンド処理ではキューがブロックされるため、Node.jsコードでCPUバウンド処理を行わないように注意してください。

Node.jsは、オペレーティングシステムカーネルに作業負荷を負担させるためIOを非ブロックにし、IO操作がデータを( イベントとして )供給すると、指定されたコールバックでコードを通知します。