Nodejs 的事件循环

Tags
nodejs
Created
Feb 23, 2018 3:39 AM

https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/

http://www.ruanyifeng.com/blog/2018/02/node-event-loop.html

https://zhuanlan.zhihu.com/p/35039878

http://docs.libuv.org/en/v1.x/design.html

事件循环是在主线程上完成的。事件循环会无限次地执行,一轮又一轮。只有异步任务的回调函数队列清空了,才会停止执行。每一轮的事件循环,分成六个阶段。这些阶段会依次执行。

  1. timers
  2. pending callbacks 执行已经准备好的 I/O 回调
  3. idle, prepare 仅系统内部使用
  4. poll,用于轮询还未返回的 I/O 事件,必要时进行阻塞 // 所以事件循环不会占用所有 CPU 时间片
  5. check,执行 setImmediate() 的回调函数
  6. close callbacks,执行关闭请求的回调函数

process.nextTick 并不属于事件循环中的某一个阶段,无论事件循环的当前阶段如何,都将在同步操作完成后处理 nextTickQueue。

Node 11 及以后,微任务的处理和浏览器等一样。// 与在哪个事件循环阶段无关

setTimeout(()=>{
    console.log('timer1')
    Promise.resolve().then(function() {
        console.log('promise1')
    })
}, 0)


setTimeout(()=>{
    console.log('timer2')
    Promise.resolve().then(function() {
        console.log('promise2')
    })
}, 0)
// node 11 以前输出:
// timer1
// timer2
// promise1
// promise2
SuperMade with Super