在程序中设置2个线程:一个负责程序本身的运行,称为主线程;一个扶额在主线程与其他进程的通信,称为Event Loop线程(消息线程)
Event Loop是一个执行模型,在不同的地方有不同的地方有不同的实现
1.浏览器的Event Loop是在html5的规范中明确定义
2.node js的Event Loop是基于libuv实现的
3.libuv已经对Event Loop做出了实现,而html5规范中只是定义了浏览器中Event Loop的模型
----宏队列和微队列
--宏队列 macrotask tasks
一些异步任务的回调会依次进入宏队列,等待后续被调用,这些异步任务包括:
1.setTimeout 2.setInterval 3.setImmediate(Node 独有) 4.requestAnimationFrame(浏览器独有) 5.I/O=>ajax DOM操作 6.UI rendering(浏览器独有)
--微队列 microtask jobs
一些异步任务的回调会依次进入为队列,等待后续被调用,这些异步任务包括:
1.process.nextTick(Node独有) 2.Promise 3.Object.observe 4.MutationObserver
----浏览器的Event Loop
--具体流程
1.执行全局script同步代码(有一些是同步语句 有一些是异步语句)
2.全局script代码执行完成后,调用栈stack会清空
3.从微队列microtask queue中取出位于队首的回调任务,放入调用栈stack中执行,执行完后微队列长度减1
4.继续取出位于微队列队首的任务,放入调用栈stack中执行,以此类推,直到把微队列stack中的所有任务都执行完成;如果在执行微任务的过程中,又产生了微任务,那么这个新产生的微任务会加入到微队列的队尾,也会在这个周期被调用执行
5.微队列中的所有任务都执行完成,此时微队列为空队列,调用栈stack也为空
6.取出宏队列中位于队首的任务,放入stack中执行
7.执行完成后,调用栈为空
8.重复第3-7个步骤。。。
重点:
1.宏队列一次只从队列中取一个任务执行,执行完后就去执行微任务队列中的任务
2.微任务队列中所有任务都会被依次取出来执行,直到微任务队列为空
----nodejs11之前的Event Loop机制
1.V8引擎解析javascript脚本
2.解析后的代码,调用Node API
3.libuv库负责Node API的执行,它将不同的任务分配给不同的线程,形成一个Event Loop,以异步的方式将任务的执行结果返回给V8引擎
4.V8引擎再将结果返回给用户
--nodejs中的宏队列和微队列
具体流程:nodejs11之前任务分配,先执行全局script代码,执行完同步代码调用栈清空后,先从微任务队列Next Tick队列中依次取出所有的任务放入调用栈中执行,再从微任务队列Other Microtask Queue中依次取出所有的任务放入调用栈中执行;然后开始宏任务的6个阶段,每个阶段都将改宏任务队列中的所有任务都取出来执行,每个宏任务阶执行完成后,开始执行微任务,再开始执行下一阶段宏任务,以此构成事件循环
宏任务包括:
1.setTimeout 2.setInterval 3.setImmediate 4.requestAnimation 5.IO 6.UI rendering
微队列包括
1.process.nextTick() 2.Promise 3.Object.observe 4.MutationObserver
----node11 Event Loop机制
node11之后 Event Loop机制和浏览器一致
--nodejs提供的方法
process.nextTick() 方法可以在当前执行栈的尾部(下一次Event Loop)之前触发回调函数,即它指定的任务总是发生在所有异步任务之前
setInmmediate() 方法是在当前任务队列的尾部添加事件,即它指定的任务总是在下一次Event Loop时执行
----同步和异步
同步和异步关心的是消息的通知方式 同步和异步是被调用方决定的,决定立刻给结果还是之后通知给结果
同步:当发起一个请求(调用)的时候,没有取得反馈(结果)之前,调用不会返回,直到取得结果;一次只做一件事
异步:当发起一个调用时,没有取得反馈之前,调用就返回了,调用者不会立刻得到结果,而是等待被调用者通知调用者,通过回调函数等方式处理结果
----阻塞和非阻塞
阻塞和非阻塞关注的是等待结果时的状态 阻塞和非阻塞是调用方决定的,决定在等待结果过程中是否可以做其他事情
阻塞:在等待结果的过程中,不能做其他事情,线程被挂起,直到结果返回
非阻塞:在等待结果的过程中,还能做其他事情,线程不会被阻塞
本文详细介绍了Node.js的Event Loop机制,包括宏队列和微队列的概念,以及它们在浏览器和Node.js中的不同实现。在Node.js中,宏任务如setTimeout和Promise分别对应不同的执行阶段,而微任务如process.nextTick和Promise则会在宏任务执行后立即执行。此外,文章还区分了同步和异步、阻塞和非阻塞的概念,帮助理解事件循环的工作原理。
637

被折叠的 条评论
为什么被折叠?



