事件循环

阻止操作示例

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 操作提供数据( 作为事件 )时,它将使用你提供的回调通知你的代码。