NodeJS 事件循环
什么是事件循环
事件循环是 Node.js 处理非阻塞 I/O 操作的机制——尽管 JavaScript 是单线程处理的——当有可能的时候,它们会把操作转移到系统内核中去。浏览器事件循环与 Nodejs 事件循环的区别
Nodejs 事件循环的简化流程
图片来自 Nodejs 官网
阶段概述
阶段代表的含义
timers 阶段:主要是执行宏任务注册的回调函数,诸如 setTimeout,setInterval 等的回调函数。
pending callbacks:此阶段执行某些系统操作的回调,例如 TCP 错误。 举个例子,如果 TCP 套接字在尝试连接时收到 ECONNREFUSED,则某些* nix 系统希望等待报告错误。 这将会在 pending callbacks 阶段排队执行
idle/prepare:主要是系统级回调,无需关心
poll:i/o 阶段,例如 fs.readFiles...等 I/O 操作
check:setImmediate 注册的回调函数将在这个这个阶段执行
close callbacks: 这个阶段主要执行一些关闭函数,诸如 socket.on('close', ... )等方法。Nodejs 每一次的事件循环始于 timers 阶段,结束于 close callbacks 阶段,当每轮事件循环结束后会立刻开启一轮新的事件循环,这就是 EventLoop。
需要注意的点
根据上图能看到,poll 轮训阶段是处理 I/O 相关操作的,所以在 poll 轮训中是有机会存在轮训暂停,等待新的 I/O 任务的时候,如果有新的 I/O 任务,就会执行 I/O 操作。
什么时候会停留?当 timers 阶段没有注册的回调函数,以及 check 阶段没有注册的回调函数的时候,事件循环会在 poll 阶段进行短暂的停留,等待新的 I/O 操作。
什么时候不停留?当 timers 阶段和 check 阶段的回调队列不为空的时候就会不做暂停,事件循环会从 poll 轮训阶段跳转到 check 阶段
Nodejs 的事件循环同样分为微任务宏任务,在 Nodejs 的微任务中,process.nextTick()的优先级是高于 Promise 的。
代码示例
Nodejs 如何进行事件循环的
示例 1
示例 2
示例 3
示例 4
示例 5
示例 6
示例 7
参考资料
其他请参考 Nodejs 官网https://nodejs.org/zh-cn/docs/guides/event-loop-timers-and-nexttick/
版权声明: 本文为 InfoQ 作者【shinji】的原创文章。
原文链接:【http://xie.infoq.cn/article/f998ddf5e94b7b978c786395e】。文章转载请联系作者。
评论