浏览器事件循环和node事件循环

Node.js事件循环

Node.js是单进程单线程应用程序 但是因为V8引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发 所以性能非常高

Node.js 几乎每一个API都是支持回调函数的

Node.js基本上所有的事件机制都是用设计模式中的观察者模式实现

Node.js单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出 每个异步事件都生成一个事件观察者 如果有事件发生就调用该回调函数

浏览器事件循环和node事件循环的区别
node事件循环
  • timer定时器阶段:执行如setTimeout和setInterval等的回调函数
  • I/O(I/O 其实就是 input 和 output 的缩写,即输入/输出)回调阶段:执行上一轮循环中未执行的I/O回调函数
  • ldle闲置阶段: 仅供系统内部使用
  • Poll轮询阶段: 这是一个至关重要的阶段 系统主要做两件事,一是回到timer阶段执行I/O回调 会主动检测是否有新的l/O事件,若存在新的I/O事件 则执行回调函数,适当的条件下,node将阻塞在这里
  • check检查阶段: 执行setImmediate的回调函数
  • close callbacks关闭回调阶段:执行socket.close()事件回调
浏览器事件循环
  • 浏览器首先会执行主线程上的代码(相当于宏任务),遇到微任务便将其推入微任务队列中 遇到宏任务便推入宏任务队列中
  • 当主线程中的代码执行完后,会检查微任务队列是否为空 若不为空 则将微任务队列中的微任务推至执行栈中执行 在执行的该微任务的过程中,如果又遇到宏任务则将其推入宏任务队列,遇到微任务则推入微任务队列
  • 当微任务队列执行完为空时,检查宏任务队列是否为空,如不为空,则将对头宏任务推入执行栈开始执行.该过程中,若遇到宏任务则将其推入宏任务队列,若遇到微任务,则推入微任务
  • 每当执行完一个宏任务 不管宏任务队列中是否还存在宏任务 都必须检查微任务队列中是否有微任务 若存在微任务 则开始执行微任务
  • 重复以上步骤 直至执行完毕
两者的区别
  • 在浏览器事件循环中,每执行完一个宏任务 便要检查执行微任务队列;而node事件循环中则是在"上一阶段"执行完,"下一阶段’'开始前执行微任务队列中的任务,也就是说,node中的微任务是在两个阶段之间执行的,如果是node10及其之前版本,要看第一个定时器执行完,第二个定时器是否在完成队列中
  • 在浏览器事件中,process.nextTick()属于微任务,而且和其他微任务一样的 ,不存在哪个微任务的优先级高就先执行谁,但是在node中process.nextTick()的优先级要高于其他微任务,也就是说,在两个阶段之间执行微任务时,若存在process.nextTick(),则先执行它,然后再执行其他微任务.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值