最新要闻
- 主龙骨图片_主龙骨
- 一次看过瘾!《流浪地球》系列两部电影下周连映:时长5小时
- 环球热门:全球第15!小米13 Pro DXO音频140分:险胜iPhone 13 Pro Max
- 今日最新!有六百万人 沉迷在B站上看“抓小偷”
- 天天报道:不退休不会卖股票!董明珠:格力没实现6000亿营收目标 有遗憾
- 【天天新要闻】500km续航纯电MPV!李想首曝网约车D1 Plus:项目被叫停太遗憾
- 吕钱浩:苹果2026年可能会推真全面屏iPhone 那个时候中兴已是第7代了
- 焦点快报!博主阿秋准备坐地铁游香港:晒证件自证是90后
- 环球快资讯:手机换号伤不起!当代人换手机号的成本有多高?
- 百事通!iPhone 17 Pro将是最完美iPhone!果粉还要等两年时间
- 苦是一种享受!董明珠回应仍做手机:格力一些部件必靠进口 国产质量不达标
- 冷水江市气象局发布大风蓝色预警【Ⅳ级/一般】
- 自称从清华退学考北大博主删除视频:此前收获50万点赞 快速涨粉
- 全球新资讯:2999元国产显卡抢疯了 Steam游戏实测能玩 老黄旧将打造
- 当前快看:实拍成都6-7级大风来袭:狂风呼啸树折腰 行人雨伞秒被吹翻
- 邹磊委员:推进“风光水火储”多能互补综合能源供给体系建设
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
宏任务&微处理
事件循环
JavaScript 语言的一大特点就是单线程,同一个时间只能做一件事。为了协调事件、用户交互、脚本、UI 渲染和网络处理等行为,防止主线程的不阻塞,Event Loop的方案应用而生。Event Loop 包含两类:一类是基于Browsing Context,一种是基于Worker。二者的运行是独立的,也就是说,每一个 JavaScript 运行的"线程环境"都有一个独立的 Event Loop,每一个 Web Worker 也有一个独立的 Event Loop。
任务队列
根据规范,事件循环是通过任务队列的机制来进行协调的。一个 Event Loop 中,可以有一个或者多个任务队列(task queue),一个任务队列便是一系列有序任务(task)的集合;每个任务都有一个任务源(task source),源自同一个任务源的 task 必须放到同一个任务队列,从不同源来的则被添加到不同队列。setTimeout/Promise 等API便是任务源,而进入任务队列的是他们指定的具体执行任务。在事件循环中,每进行一次循环操作称为 tick,每一次 tick 的任务处理模型是比较复杂的,但关键步骤如下:
- 在此次 tick 中选择最先进入队列的任务(oldest task),如果有则执行(一次)
- 检查是否存在 Microtasks,如果存在则不停地执行,直至清空 Microtasks Queue
- 更新 render
- 主线程重复执行上述步骤
在上诉tick的基础上需要了解几点:
【资料图】
- JS分为同步任务和异步任务
- 同步任务都在主线程上执行,形成一个执行栈
- 主线程之外,事件触发线程管理着一个任务队列,只要异步任务有了运行结果,就在任务队列之中放置一个事件。
- 一旦执行栈中的所有同步任务执行完毕(此时JS引擎空闲),系统就会读取任务队列,将可运行的异步任务添加到可执行栈中,开始执行。
案例解释
现在有这样一段代码
console.log(1)Promise.resolve().then(() => { console.log(2)})console.log(3)
要真正理解这一段代码,我们必须先搞懂Promise中实例方法then到底在做什么?then相当于为Promise设置了一个回调函数,当Promise中的数据处理完毕时,便会调用then所设置的回调函数来继续后续任务。上例中,我们通过Promise.resolve()创建了一个理解完成的Promise,那么按道理讲then中的回调函数应该立刻执行啊?因为Promise已经完成了啊?所以打印的顺序不应该是“1 2 3”吗?then中的回调函数会在Promise完成后(status由pending变为fulfilled时)被调用,但是注意并不是立刻就调用,而是采用一种和定时器类似的处理方式,将函数放入到一个任务队列中,而队列中的代码会在调用栈中的代码执行完毕后才会执行。也就是说then中的代码总是在当前调用栈中的代码执行完后才执行。所以上边代码的输出结果应该为:“1 3 2”
setTimeout(()=>{ console.log(1)})Promise.resolve().then(() => { console.log(2)})
这段代码的执行顺序又是什么呢?错误的分析:setTimeout是定时器,它会在一段时间后将函数放入到任务队列中,而我们没有指定时间,也就意味着函数会立刻放入到任务队列中。then同样也是将函数放入到任务队列中,并且这个Promise是一个立即完成的Promise所以函数也是立刻进入任务队列。那么按照执行顺序来讲,定时器在前,then在后,所以定时器中的函数应该先进入队列,队列又是先进先出的,所以应该先1后2。上边的分析看似合理,实际上是不对的。因为setTimeout和then虽然都将函数放入到队列中,但是却不是同一个队列。为了更合理的处理异步任务,ES标准规定了一个内部的队列“PromiseJobs”
,这个队列是专门用来放置由Promise产生的回调函数的(then、catch、finally),这个队列我们通常被称为“微任务队列(microtask queue)”。相对的,setTimeout这些方法是将函数放入到了“宏任务队列(macrotask queue)”。简单来说,任务队列有两个,宏任务队列和微任务队列。代码执行时,宏任务进入到宏任务队列,微任务进入到微任务队列。大部分的任务都属于宏任务,而微任务通常在代码运行时产生,通常是由Promise所创建的,Promise的then、catch、finally中的回调函数会作为微任务进入到微任务队列中。JS代码执行时,每一个宏任务执行完毕后,JS引擎会立即执行微任务队列中的所有任务,然后才是执行宏任务队列中的任务。换句话中then中的回调函数(微任务)会先于定时器中的回调函数(宏任务)执行。所以上例中代码的执行结果应该为:“2 1”。
console.log(1);setTimeout(() => console.log(2));Promise.resolve().then(() => console.log(3));Promise.resolve().then(() => setTimeout(() => console.log(4)));Promise.resolve().then(() => console.log(5));setTimeout(() => console.log(6));console.log(7);// 1 7 3 5 2 6 4
宏任务
(macro)task,可以理解是每次执行栈 执行的代码就是一个宏任务(包括每次从事件队列中获取一个事件回调并放到执行栈中执行)。浏览器为了能够使得JS内部(macro)task与DOM任务能够有序的执行,会在一个(macro)task执行结束后,在下一个(macro)task 执行开始前,对页面进行重新渲染,流程如下:
(macro)task->渲染->(macro)task->...
微任务
microtask,可以理解是在当前 task 执行结束后立即执行的任务。也就是说,在当前task任务后,下一个task之前,在渲染之前。所以它的响应速度相比setTimeout(setTimeout是task)会更快,因为无需等渲染。也就是说,在某一个macrotask执行完后,就会将在它执行期间产生的所有microtask都执行完毕(在渲染前)。
运行机制
在事件循环中,每进行一次循环操作称为tick,每一次tick的任务处理模型是比较复杂的,但关键步骤如下:
- 执行一个宏任务(栈中没有就从事件队列中获取)
- 执行过程中如果遇到微任务,就将其添加到微任务队列中
- 宏任务执行完毕后,立即执行当前微任务队列中所有微任务(依次执行)
- 当前宏任务执行完毕,开始检查渲染,然后GUI线程接管渲染
- 渲染完毕后,JS线程继续接管,开始下一个宏任务(从事件队列中获取)
有几个关键点如下:
- 所有微任务总会在下一个宏任务之前全部执行完毕,宏任务必然是在微任务之后才执行的(因为微任务实际上是宏任务的其中一个步骤)。
- 宏任务按顺序执行,且浏览器在每个宏任务之间渲染页面
- 所有微任务也按顺序执行,且在以下场景会立即执行所有微任务
- 每个回调之后且js执行栈中为空。
- 每个宏任务结束后。
通过例子加深理解
setTimeout(() => console.log(4))new Promise(resolve => { resolve()console.log(1)}).then(() => { console.log(3)})console.log(2)
流程如下:
- 整体script作为第一个宏任务进入主线程,遇到setTimeout入栈处理,发现是异步函数(宏任务),出栈,移交给Web API处理,0秒等待后,将回调函数加到宏任务队列尾部;
- 遇到new Promise,入栈处理,发现是同步任务,直接执行,console输出1;
- 遇到then,入栈处理,发现是异步函数(微任务),出栈,移交给Web API处理,将回调函数加入微任务队列尾部;
- 遇到console.log(2),入栈处理,同步任务,直接console输出2, 出栈;
- 栈已清空,检查微任务队列;
- 取出第一个回调函数,入栈处理,发现是同步任务,直接console输出3, 出栈;
- 继续从取微任务队列中取下一个,发现微任务队列已清空,结束第一轮事件循环;
- 从宏任务队列中取出第一个宏任务,入栈处理,发现是同步任务,直接console输出4;
所以,最终输出结果为:1 > 2 > 3 > 4
稍微改变一下
setTimeout(_ => console.log(4))new Promise(resolve => { resolve() console.log(1)}).then(_ => { console.log(3) Promise.resolve().then(_ => { console.log("before timeout") }).then(_ => { Promise.resolve().then(_ => { console.log("also before timeout") }) })})console.log(2)
最终输出结果为:1 > 2 > 3 > before timeout > also before timeout > 4before timeout与also before timeout在4之前输出的原因是,在微任务执行的过程中,新产生的微任务会被直接添加到微任务队列尾部,并在下一宏任务执行之前,全部执行掉。而如果在微任务执行的过程中,新产生了宏任务,则会进入到宏任务队列尾部,按照宏任务顺序在后面的事件循环中执行。
再来一个嵌套的例子
Promise.resolve().then(()=>{ console.log("Promise1") setTimeout(()=>{ console.log("setTimeout2") },0)})setTimeout(()=>{ console.log("setTimeout1") Promise.resolve().then(()=>{ console.log("Promise2") })},0)
最后输出结果是Promise1 > setTimeout1 > Promise2 > setTimeout2
- 一开始执行栈的同步任务执行完毕,会去 microtasks queues 找,清空 microtasks queues ,输出Promise1,同时会生成一个异步任务 setTimeout1
- 去宏任务队列查看此时队列是 setTimeout1 在 setTimeout2 之前,因为setTimeout1执行栈一开始的时候就开始异步执行,所以输出 setTimeout1
- 在执行setTimeout1时会生成Promise2的一个 microtasks ,放入 microtasks queues 中,接着又是一个循环,去清空 microtasks queues ,输出 Promise2
- 清空完 microtasks queues ,就又会去宏任务队列取一个,这回取的是 setTimeout2
作者:pl链接:https://juejin.cn/post/7072666354402197540来源:稀土掘金作者: 李立超链接:https://www.lilichao.com/index.php/2022/10/12/宏任务和微任务/
关键词:
-
焦点热门:读Java性能权威指南(第2版)笔记14_垃圾回收A
1 & 160;垃圾回收器1 1 & 160;对象可以在被需要时创建,不再使用时由JVM自动回收1 2 & 160;GC是...
来源: 宏任务&微处理
主龙骨图片_主龙骨
一次看过瘾!《流浪地球》系列两部电影下周连映:时长5小时
焦点热门:读Java性能权威指南(第2版)笔记14_垃圾回收A
环球热门:全球第15!小米13 Pro DXO音频140分:险胜iPhone 13 Pro Max
今日最新!有六百万人 沉迷在B站上看“抓小偷”
天天报道:不退休不会卖股票!董明珠:格力没实现6000亿营收目标 有遗憾
怎么利用异步设计提升系统性能?
【天天新要闻】500km续航纯电MPV!李想首曝网约车D1 Plus:项目被叫停太遗憾
全球观焦点:Go 面向对象
全球快播:Vue——Vue初始化【三】
吕钱浩:苹果2026年可能会推真全面屏iPhone 那个时候中兴已是第7代了
焦点快报!博主阿秋准备坐地铁游香港:晒证件自证是90后
环球快资讯:手机换号伤不起!当代人换手机号的成本有多高?
百事通!iPhone 17 Pro将是最完美iPhone!果粉还要等两年时间
苦是一种享受!董明珠回应仍做手机:格力一些部件必靠进口 国产质量不达标
冷水江市气象局发布大风蓝色预警【Ⅳ级/一般】
自称从清华退学考北大博主删除视频:此前收获50万点赞 快速涨粉
世界热议:PMP项目变更管理及变更流程总结
利用CSS使博客园图片自动居中,而文字保持居左
天天热文:量化交易基础 - 012 - 检验中的假设条件
全球新资讯:2999元国产显卡抢疯了 Steam游戏实测能玩 老黄旧将打造
当前快看:实拍成都6-7级大风来袭:狂风呼啸树折腰 行人雨伞秒被吹翻
邹磊委员:推进“风光水火储”多能互补综合能源供给体系建设
Log4j 配置
每日速递:flink入门-流处理
全球消息!汉诺塔问题——分而治之(引入递归,解决重复子问题)
世界球精选!Java基础入门-数组练习
国内已超越GPS 北斗卫星今年再发三颗星:下一代已在路上
世界观点:称根据身体来划分性别比较好 女星桥本爱被LGBT攻击
【独家】女生月薪两万辞职考研八次失败:次次铩羽而归
全球新资讯:第128篇:浏览器存储(cookie、webStorage、 IndexedDB)
世界简讯:关于使用python脚本将同级的其他目录下的所有文件根据年份移动到当脚本位置的年份目录
环球今热点:SSD比机械硬盘更容易坏?实测来了:跟想象中不一样
全球观天下!2月轿车销量排名:两“逸”同病相怜、秦汉一马平川
通讯!姚劲波代表:高学历干家政可能会越发普遍
《庆余年2》冲上热搜榜:网曝郭麒麟演的角色范思辙换人了
资讯:shiro-550反序列化漏洞分析
资讯:64.异常
世界热文:[新媒体运营]新媒体运营概述
9名初中生花18元点18串里脊庆生 网友看哭:回不去的年华
今日报丨金钱豹回拜游客 动物园回应:没人教、第一次见
世界今日报丨隅田川进口胶囊咖啡液8杯到手10.9元:更鲜更好喝
有赞一面:还有任务没执行,线程池被关闭怎么办?
全球快看点丨注解与反射
java基础二-面向对象的三大特性
全球最资讯丨A卡有能力跟RTX 4090正面刚 AMD:不做是因为太贵、功耗高
微头条丨深山红烛 照亮希望
环球新消息丨Redis 深度学习
环球快资讯:前端设计模式——策略模式
新消息丨MySQL学习笔记-SQL实践1
每日快报!安全性不行 Win7系统真的别用了 又一个游戏《堡垒之夜》放弃支持
每日快播:童年回来了!《灌篮高手》发布流川枫角色海报
每日报道:使用web client对 vcenter 进行补丁升级
有监督学习——梯度下降
全球百事通!聪明的燕姿
当前视点!Oracle数据库中没有scott账户的方法
今日热闻!光速破发?iPhone 14黄色版还未开售便降价600元
华硕发布ROG Strix Impact III鼠标:双手通用、可更换微动插槽
真香!重庆购买HUAWEI问界M7直补3万:起售仅25.98万
当前简讯:滴滴快车预付车费什么时候退款_滴滴快车预付车费什么意思
世界通讯!网络安全(中职组)-B模块:Web安全应用-2
今日播报!客服回应疯狂小杨哥带货翻车:有巡查、违规会处罚
怕了吗?长城公布“1000万悬赏计划”:严厉打击网络水军
【世界新要闻】四位计数器testbench的设计
世界滚动:chatgpt 集成飞书实践指南
自以为是 与 思考
天天通讯!伊朗外长:伊沙恢复外交关系将为两国和地区发展注入巨大动能
世界快讯:日系车掀起买一送一热潮:买皓影插混送飞度、买日产楼兰送轩逸
天天热资讯!50万以内最舒适二排 理想L7正式交付:31.98万起售
环球新资讯:10年分红1000多亿!董明珠鼓励员工“砸锅卖铁”买格力股票
剪刀石头布的算法
资讯推荐:全球最强!传音发布260W有线、110无线快充:8分钟充满
世界观热点:美国科学家改变人类科技、终极能源即将实现?真相来了!
世界快讯:《原子之心》更新:添加FOV设置、删除种族主义动画
Shell命令-常用操作2
【质因数分解算法详解】C/Java/Go/Python/JS/Dart/Swift/Rust等不同语言实现
今亮点!霸道女总裁加盟《碟中谍8》
天天播报:00后男生每天下班后卖烤肠解压 50元投资日赚200元:厌恶刷视频、打游戏
【时快讯】网络安全(中职组)-B模块:Web安全渗透测试
环球新消息丨K8S 性能优化-K8S Node 参数调优
环球微速讯:比进口价格便宜!海南三亚榴莲今年6月将大规模上市
当废物挺好?委员称年轻人想躺平更多是调侃 奋斗的是大多数
天天亮点!中国足彩网竞彩11日推荐:曼城取胜无悬念
焦点短讯!使用SSM+Shiro+Layui框架,基于RBAC3模型开发的权限管理系统
snort入侵检测基础概述
当前播报:amusements
环球热议:6月上映!《变形金刚7》角色海报发布:擎天柱、猩猩队长亮相
【速看料】降价潮席卷全国 车企尽数参战是为何?乘联会解答:国六B要来了
观热点:01-C语言概述
环球今热点:真正油电同价!比亚迪投放“深水炸弹”:13.4万买宋Pro DM-i超级混动
环球通讯!立春来首场寒潮横扫我国大部:多地将遭遇滑梯式降温 最高降20℃
【新要闻】活久见!女生家中发现神奇圆柱形手机:登QQ、手电筒、拍照 功能多到炸
读Java性能权威指南(第2版)笔记13_堆内存下
最便宜竖折叠继任者!摩托罗拉Razr 2023真机图出炉:首次拼色后壳
当前快报:汽车价格战新进展:南北大众同日入局 丰田买一辆送一辆
世界速递!day05-功能实现04
Vue————Vue v2.7.14 入口文件【二】
【时快讯】《满江红》中国影史票房榜第6:力压《唐人街探案3》 票房突破45.23亿
环球即时:2023开门红!长四丙成功发射“一箭双星”