一文大白话讲清楚Node中的事件循环机制

一文大白话讲清楚Node中的事件循环机制

1. 先回忆javascript事件循环机制

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的作用就是把一个事件设定为微任务

4.2 宏任务

4.2.1 setTimeout和setInterval->timers queue

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许先森森

爱我就打我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值