JavaScript异步机制(二)之任务队列和事件循环

栏目: JavaScript · 发布时间: 6年前

内容简介:GUI渲染线程负责渲染浏览器界面HTML元素,当界面需要Javascript引擎,也可以称为JS内核,主要负责处理Javascript脚本程序,例如V8引擎。Javascript引擎线程负责解析Javascript脚本,运行代码。当一个事件被触发时该线程会把事件添加到待处理事件队列的队尾,等待JS引擎的处理。这些事件可以是当前执行的代码块如定时任务、也可来自浏览器内核的其他线程如鼠标点击、AJAX异步请求等,但由于JS的单线程关系所有这些事件都得排队等待JS引擎处理。

GUI渲染线程负责渲染浏览器界面HTML元素,当界面需要 重绘 (Repaint)或由于某种操作引发 回流 (reflow)时,该线程就会执行。在Javascript引擎运行脚本期间,GUI渲染线程都是处于挂起状态的,也就是说被”冻结”了。

JavaScript引擎线程

Javascript引擎,也可以称为JS内核,主要负责处理Javascript脚本程序,例如V8引擎。Javascript引擎线程负责解析Javascript脚本,运行代码。

事件触发线程

当一个事件被触发时该线程会把事件添加到待处理事件队列的队尾,等待JS引擎的处理。这些事件可以是当前执行的代码块如定时任务、也可来自浏览器内核的其他线程如鼠标点击、AJAX异步请求等,但由于JS的单线程关系所有这些事件都得排队等待JS引擎处理。

定时器线程

浏览器定时计数器并不是由JavaScript引擎计数的, 因为JavaScript引擎是单线程的,如果处于阻塞线程状态就会影响记计时的准确, 因此通过单独线程来计时并触发定时是更为合理的方案。

异步HTTP请求线程

在XMLHttpRequest在连接后通过浏览器新开一个线程请求,在检测到状态变更时,会触发相应的事件,如果设置有回调函数,异步线程就产生状态变更事件,将事件处理程序放到 JavaScript引擎的处理队列中等待处理。

那么什么是任务队列呢?

任务队列

大家都知道JS是单线程的,假如在JS引擎执行代码的过程中触发了一些事件,那引擎会停下手中的事情来处理这些事件吗?当然不可能。那什么时候才能执行这些事件处理程序呢?在js引擎空闲的时候。实际上,无论是事件触发还是定时器还是HTTP请求,在各自的线程处理好对应的API之后,会把各自的事件处理程序放到一个叫做任务队列的数据结构中。在JS引擎空闲的时候会按顺序去执行每一个事件处理程序。按怎样的顺序?先进队列的先执行。这叫先进先出,和栈结构的后进先出正好相反。

事件循环

当JS引擎执行完代码之后,如果任务队列中有待处理的事件处理程序,那么JS引擎回去立即执行这些程序,那么假如现在任务队列是空的,但是过了一会有事件触发了,JS引擎是如何知道的呢?这就要讲到事件循环了。当JS引擎空闲的时候,他会不断的是轮询任务队列,如果有任务的话就去执行。

微任务

微任务包括promise的回调,mutationObserver的回调,以及nodejs的process.nextTick的回调。

宏任务

script全部代码。setTimeout,setInterval,setImmediate,I/O,UI Rendering

JS引擎初始执行代码如果遇到微任务,会将微任务放到微任务队列中,如果有宏任务,则将其放入宏任务队列。执行完代码后,会先去执行微任务队列中的事件,然后就是不断的事件循环。

我们可以把初始代码当成一个宏任务,在执行完这个宏任务之后,JS引擎会去处理本轮宏任务结束时的微任务队列,然后再去处理宏任务队列。所以执行微任务的时机就是在宏任务与宏任务之间。

更新视图

浏览器更新视图的时机是由其自己决定的,并不一定是宏任务与宏任务之间一定有视图的更新。可以确定的是,在JS引擎执行代码时,是不会更新视图的,因为GUI 渲染线程与JavaScript引擎线程互斥!浏览器会在适当的时机(宏任务与宏任务之间)更新视图,然后再继续执行代码。

GUI 渲染线程 与 JavaScript引擎线程互斥!

由于JavaScript是可操纵DOM的,如果在修改这些元素属性同时渲染界面(即JavaScript线程和UI线程同时运行),那么渲染线程前后获得的元素数据就可能不一致了。因此为了防止渲染出现不可预期的结果,浏览器设置GUI渲染线程与JavaScript引擎为互斥的关系,当JavaScript引擎执行时GUI线程会被挂起,GUI更新会被保存在一个队列中等到引擎线程空闲时立即被执行。


以上所述就是小编给大家介绍的《JavaScript异步机制(二)之任务队列和事件循环》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Learn Python the Hard Way

Learn Python the Hard Way

Zed A. Shaw / Addison-Wesley Professional / 2013-10-11 / USD 39.99

Master Python and become a programmer-even if you never thought you could! This breakthrough book and CD can help practically anyone get started in programming. It's called "The Hard Way," but it's re......一起来看看 《Learn Python the Hard Way》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具