事件迴圈

阻止操作示例

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)

StackOverflow 文件

簡單來說,Eve​​nt Loop 是一種單執行緒佇列機制,它以非阻塞方式執行 CPU 繫結程式碼,直到執行結束和 IO 繫結程式碼。

但是,地毯下的 Node.js 通過 libuv 庫使用多執行緒進行某些操作。

效能注意事項

  • 非阻塞操作不會阻塞佇列,也不會影響迴圈的效能。
  • 但是,CPU 繫結操作將阻塞佇列,因此你應該注意不要在 Node.js 程式碼中執行 CPU 繫結操作。

Node.js 非阻塞 IO,因為它將工作解除安裝到作業系統核心,當 IO 操作提供資料( 作為事件 )時,它將使用你提供的回撥通知你的程式碼。