原稿:语雀 · Node.js 知识点 · 原目录:Node.js › Node.js 知识点

Node 事件循环

Node.js采用 V8 作为 js 的解析引擎,而 I/O 处理方面使用 libuv,后者是一个基于事件驱动的跨平台抽象层,封装了不同操作系统一些底层特性,对外提供统一的API,事件循环机制也是它里面的实现。

根据Node.js官方介绍,每次事件循环(tick)都包含了6个阶段,对应到 libuv 源码中的实现,如下图所示:

Node.js 知识点 配图

Node 环境下,每一个阶段有一个队列,event loop 执行到该阶段时,会执行该阶段的队列里的所有 callback,当队列 callback 为空或 callback 执行到上限的时,跳至下一阶段进行执行

Node.js 知识点 配图
- timers 阶段:执行 setTimeout(callback) 和 setInterval(callback) 预定的 callback - I/O callbacks 阶段: 执行除了 close 事件、timers(setTimeout、setInterval等)、setImmediate()设定的回调之外的 callbacks - idle,prepare 阶段:仅node内部使用 - poll 阶段:获取新的 I/O 事件,因此某些条件下 node 将阻塞在这里;poll 还负责检测是否有 timer 的 callback 就绪却未执行,如果发现,那么就循环至开头执行 timer 的 callback。 - check 阶段: 执行 setImmediate() 设定的 callbacks - close callbacks 阶段: 比如 socket.on('close', callback) 等 close 事件的回调会在这个阶段执行