node与浏览器eventLoop的差异

任务队列个数不同

  • 浏览器事件环有​​2​​ 个事件队列
    • 宏任务队列
    • 微任务队列
  • NodeJS 事件环有​​6​​ 个事件队列
    • 定时器(timers):本阶段执行已经被 setTimeout() 和 setInterval() 的回调函数
    • 待定回调(pending callbacks):执行延迟到下一个循环迭代的 I/O 回调。
    • idle, prepare:仅系统内部使用
    • 轮询(poll):检索新的 I/O 事件;执行与 I/O 相关的回调(几乎所有情况下,除了关闭的回调函数,那些由计时器和 setImmediate() 调度的之外),其余情况 node 将在适当的时候在此阻塞。
    • 检测(check):setImmediate() 回调函数在这里执行。
    • 关闭的回调函数(close callbacks):一些关闭的回调函数,如:socket.on(‘close’, …)。

NodeJS中的EventLoop与浏览器的EventLoop之间的区别

  • 浏览器:先执行 一个 宏任务,然后执行所有微任务……循环往复
  • NodeJS:先执行一种 宏任务 在执行清空微任务 再一种 宏任务 在执行清空微任务 再一种 宏任务 在执行清空微任务 所有种类宏任务结束 … 循环往复

微任务队列不同

  • 浏览器事件环中有专门存储微任务的队列
  • NodeJS 事件环中没有专门存储微任务的队列

微任务执行时机不同

  • 浏览器事件环中每执行完一个宏任务都会去清空微任务队列
  • NodeJS 事件环中只有同步代码执行完毕和其它队列之间切换的时候会去清空微任务队列

微任务优先级不同

  • 浏览器事件环中如果多个微任务同时满足执行条件,采用先进先出
  • NodeJS 事件环中如果多个微任务同时满足执行条件,会按照优先级执行

浏览器的event loop 执行顺序

  • 是当执行栈 遇到异步任务将其放在异步队列中
  • 异步队列分为两种 宏任务和微任务
  • 当执行栈为空时,首先会将微任务全部取出来执行,此时微任务进入执行栈
  • 当执行栈为空,且微任务为空时,从宏任务中取出最早的一个任务,放入执行栈

NodeJS中的EventLoop

其实nodejs与浏览器的区别,就是nodejs的 宏任务 分好几种,而这好几种又有不同的 任务队列,而不同的 任务队列 又有顺序区别,而 微任务是穿插在每一种【注意不是每一个!】宏任务 之间的

  • Timers 类型的宏任务队列

    • setTimeout()
    • setInterval
  • Check 类型的宏任务队列

    • setImmediate()
  • Close callback 类型的宏任务队列

    • socket.on(‘close’, () => {})
  • Poll 类型的宏任务队列

    • 除了上面几种的其他所有回调

在这里插入图片描述

  • nodeJs 里面的微任务队列
    • process.nextTick() Promise.then()
    • process.nextTick()的优先级高于所有的微任务,每一次清空微任务列表的时候,都是先执行 process.nextTick()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值