文章目录
一文大白话讲清楚Node中的事件循环机制
1. 先回忆javascript事件循环机制
- 我们之前讲javascript属于事件循环机制 ,不懂得看这篇文章
- 一文大白话讲清楚javascript同步任务,异步任务,主线程,宏任务,微任务,事件循环以及async和await等关系
- javascript事件循环机制是根据HTML5定义的规范来实现的
- 讲node事件循环为啥要先讲js事件循环呢,因为里面讲了很多基础知识,像同步异步,回调函数等
- 所以,先看上面链接文章
2. node事件循环机制
- 在node中,事件循环式基于libuv实现,libuv是一个多平台的专注于异步IO的库
- 有人肯定得问了,啥是libuv啊,这个知道的都知道,不知道的,看我后续文章,我写一篇,名字暂叫“一文大白话讲清楚libuv",届时请关键字搜索查看
- 大概就是用C语言编写的恶一个跨平台,高性能,事件驱动的异步I/O库。
- node每次事件循环又分为6个阶段,每个阶段都维护一个回调队列,先进先出

2.1 timers阶段
- timers,定时器检测阶段,本阶段主要执行setInterval和setTimeout的回调
2.2 I/O callbacks
- I/O事件回调阶段,执行上一轮循环中未被执行的I/O回调,即执行那些延迟到下一轮循环迭代的I/O回调
2.3 idle,prepare
- 闲置阶段,供系统内部使用
2.4 poll
- 轮询阶段,检索新的I/O事件,执行与I/O相关的回调其余情况node将在适当的机会再次阻塞
2.5 check
- 检查阶段,主要执行setImmediate回调函数
2.6 close callback
- 关闭事件回调阶段,主要关闭一些关闭操作的回调函数,比如socket.on(‘close’)
- 每个阶段对应一个队列,当事件循环进入某个阶段时,将会在该阶段内执行回调,直到队列清空或者回调的最大数已执行,讲进入下一个处理阶段
3. 比较特殊的process.nextTick()
- nextTick不属于事件循环的任何一个阶段,而是在上一个事件循环结束,下一个事件循环开始前执行,可以理解为插队,插在下一个循环开始之前。
4. 任务的优先级
- node任务也分为宏任务,和微任务,微任务的优先级要比宏任务的高
4.1 微任务
4.1.1 process.nextTick()->nextTick queue
- 这个就不用说了吧,人家都插到事件循环的最开头了
4.1.2 promise.then的回调->other queue
- 我们在调用promise.then(data=>{},err=>{})时,回调函数属于微任务
4.1.3 queueMicrotask(event)->other queue
- 这个不用说,queueMicrotask的作用就是把一个事件设定为微任务

1040

被折叠的 条评论
为什么被折叠?



