10分钟了解Node.js事件循环中的:Macrotask 与 Microtask
沉沙 2018-06-06 来源 : 阅读 1210 评论 0

摘要:在Nodejs事件循环机制中,有任务两个队列:Macrotask队列和Microtask队列。在一个事件循环里,这两个队列会分两步执行,第一步会固定地执行一个(且仅一个)Macrotask任务,第二步会执行整个Microtask队列中的所有任务。希望阅读本篇文章以后大家有所收获,帮助大家对Node.js的理解更加深入。

在Nodejs事件循环机制中,有任务两个队列:Macrotask队列和Microtask队列。在一个事件循环里,这两个队列会分两步执行,第一步会固定地执行一个(且仅一个)Macrotask任务,第二步会执行整个Microtask队列中的所有任务。并且,在执行Microtask队列任务的时候,也允许加入新的Microtask任务,直到所有Microtask任务全部执行完毕,才会结束循环。

Macrotasks一般包括: setTimeout, setInterval, setImmediate, I/O, UI rendering;
Microtasks一般包括: process.nextTick, Promises, Object.observe, MutationObserver。

事件循环机制详解

从一个事件循环开始,到结束会经历以下步骤:

1. 检查Macrotask队列,选择其中最早加入(即最老的)的任务X,设置为“目前运行的任务”。如果任务X不存在,那么直接跳到步骤4。

2. 运行任务X,即运行对应的回调函数。

3.设置“目前运行的任务”为null,从Macrotask队列中移除任务X。

4.检查Microtask队列:

1)选择其中最老的任务a,如果任务a不存在,直接结束Microtask队列。

2)设置任务a为“目前运行的任务”,并执行。

3)设置“目前运行的任务”为null,从Microtask队列中移除任务a。

4)选择下一个最老的任务b,跳到步骤2)。

5)直到队列里没有剩余的任务,结束队列。

5.跳回步骤1,检查下一个Macrotask任务。

如何选用Macrotask或Microtask呢?

可以这样简单理解:如果你想让一个任务立即执行,那么就把它设置为Microtask,除此之外都用Macrotask比较好。因为可以看出,虽然Node是异步非阻塞的,但在一个事件循环中,Microtask的执行方式基本上就是用同步的。

可能存在的问题

相信读到这里你已经意识到,如果一个Microtask队列太长,或者执行过程中不断加入新的Microtask任务,会导致下一个Macrotask任务很久都执行不了。结果就是,你可能会遇到UI一直刷新不了,或者I/O任务一直完成不了。

应该是考虑到了这一点,至少Microtask任务中的process.nextTick任务,是被设置了(在一个事件循环中的)最大调用次数的,叫process.maxTickDepth。默认是1000。一定程度上避免了上述情况。

 

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注WEB前端Node.js频道!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程