摘要:一句話解釋在事件循環(huán)機(jī)制中,有任務(wù)兩個(gè)隊(duì)列隊(duì)列和隊(duì)列。設(shè)置任務(wù)為目前運(yùn)行的任務(wù),并執(zhí)行。應(yīng)該是考慮到了這一點(diǎn),至少任務(wù)中的任務(wù),是被設(shè)置了在一個(gè)事件循環(huán)中的最大調(diào)用次數(shù)的,叫。參考材料理解事件循環(huán)
在Node學(xué)習(xí)過(guò)程中,不可避免的需要對(duì)事件循環(huán)機(jī)制做深入理解,其中Macrotask(大型任務(wù))和Microtask(小型任務(wù))比較令人困惑,在一番google之后,我發(fā)現(xiàn)了幾篇資料能比較好地解釋他們的原理。因此在這里匯總+搬運(yùn)一下。
一句話解釋在Nodejs事件循環(huán)機(jī)制中,有任務(wù)兩個(gè)隊(duì)列:Macrotask隊(duì)列和Microtask隊(duì)列。在一個(gè)事件循環(huán)里,這兩個(gè)隊(duì)列會(huì)分兩步執(zhí)行,第一步會(huì)固定地執(zhí)行一個(gè)(且僅一個(gè))Macrotask任務(wù),第二步會(huì)執(zhí)行整個(gè)Microtask隊(duì)列中的所有任務(wù)。并且,在執(zhí)行Microtask隊(duì)列任務(wù)的時(shí)候,也允許加入新的Microtask任務(wù),直到所有Microtask任務(wù)全部執(zhí)行完畢,才會(huì)結(jié)束循環(huán)。
Macrotasks一般包括: setTimeout, setInterval, setImmediate, I/O, UI rendering;
Microtasks一般包括: process.nextTick, Promises, Object.observe, MutationObserver。
從一個(gè)事件循環(huán)開(kāi)始,到結(jié)束會(huì)經(jīng)歷以下步驟:
檢查Macrotask隊(duì)列,選擇其中最早加入(即最老的)的任務(wù)X,設(shè)置為“目前運(yùn)行的任務(wù)”。如果任務(wù)X不存在,那么直接跳到步驟4。
運(yùn)行任務(wù)X,即運(yùn)行對(duì)應(yīng)的回調(diào)函數(shù)。
設(shè)置“目前運(yùn)行的任務(wù)”為null,從Macrotask隊(duì)列中移除任務(wù)X。
檢查Microtask隊(duì)列:
1)選擇其中最老的任務(wù)a,如果任務(wù)a不存在,直接結(jié)束Microtask隊(duì)列。 2)設(shè)置任務(wù)a為“目前運(yùn)行的任務(wù)”,并執(zhí)行。 3)設(shè)置“目前運(yùn)行的任務(wù)”為null,從Microtask隊(duì)列中移除任務(wù)a。 4)選擇下一個(gè)最老的任務(wù)b,跳到步驟2)。 5)直到隊(duì)列里沒(méi)有剩余的任務(wù),結(jié)束隊(duì)列。
跳回步驟1,檢查下一個(gè)Macrotask任務(wù)。
關(guān)于事件循環(huán)步驟,參考文檔中的《理解 Node.js 事件循環(huán)》這篇文章講的非常好也非常詳細(xì),強(qiáng)烈推薦想了解的同學(xué)一定要看。
如何選用Macrotask或Microtask呢?可以這樣簡(jiǎn)單理解:如果你想讓一個(gè)任務(wù)立即執(zhí)行,那么就把它設(shè)置為Microtask,除此之外都用Macrotask比較好。因?yàn)榭梢钥闯?,雖然Node是異步非阻塞的,但在一個(gè)事件循環(huán)中,Microtask的執(zhí)行方式基本上就是用同步的。
可能存在的問(wèn)題相信讀到這里你已經(jīng)意識(shí)到,如果一個(gè)Microtask隊(duì)列太長(zhǎng),或者執(zhí)行過(guò)程中不斷加入新的Microtask任務(wù),會(huì)導(dǎo)致下一個(gè)Macrotask任務(wù)很久都執(zhí)行不了。結(jié)果就是,你可能會(huì)遇到UI一直刷新不了,或者I/O任務(wù)一直完成不了。
應(yīng)該是考慮到了這一點(diǎn),至少M(fèi)icrotask任務(wù)中的process.nextTick任務(wù),是被設(shè)置了(在一個(gè)事件循環(huán)中的)最大調(diào)用次數(shù)的,叫process.maxTickDepth。默認(rèn)是1000。一定程度上避免了上述情況。
參考材料理解 Node.js 事件循環(huán)
Difference between microtask and macrotask within an event loop context
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91266.html
摘要:的單線程,與它的用途有關(guān)。事件循環(huán)事件循環(huán)是指主線程重復(fù)從消息隊(duì)列中取消息執(zhí)行的過(guò)程。到此為止,就完成了工作線程對(duì)主線程的通知,回調(diào)函數(shù)也就得到了執(zhí)行。 一. 區(qū)分進(jìn)程和線程 很多新手是區(qū)分不清線程和進(jìn)程的,沒(méi)有關(guān)系。這很正常。先看看下面這個(gè)形象的比喻: 進(jìn)程是一個(gè)工廠,工廠有它的獨(dú)立資源-工廠之間相互獨(dú)立-線程是工廠中的工人,多個(gè)工人協(xié)作完成任務(wù)-工廠內(nèi)有一個(gè)或多個(gè)工人-工人之間共享...
摘要:如果沒(méi)到毫秒,那么階段就會(huì)跳過(guò),進(jìn)入階段,先執(zhí)行的回調(diào)函數(shù)。參考文檔什么是瀏覽器的事件循環(huán)不要混淆和瀏覽器中的定時(shí)器詳解瀏覽器和不同的事件循環(huán)深入理解事件循環(huán)機(jī)制篇中的執(zhí)行機(jī)制 最近對(duì)Event loop比較感興趣,所以了解了一下。但是發(fā)現(xiàn)整個(gè)Event loop盡管有很多篇文章,但是沒(méi)有一篇可以看完就對(duì)它所有內(nèi)容都了解的文章。大部分的文章都只闡述了瀏覽器或者Node二者之一,沒(méi)有對(duì)比...
摘要:瀏覽器和中并不一樣,瀏覽器的是在中定義的規(guī)范,而中則由庫(kù)實(shí)現(xiàn)。整個(gè)的這種運(yùn)行機(jī)制又稱為事件循環(huán)例子了解瀏覽器的后,查看下面例子,猜測(cè)瀏覽器是怎么輸出的瀏覽器輸出中的在內(nèi)部有這樣一個(gè)事件環(huán)機(jī)制。在啟動(dòng)時(shí)會(huì)初始化事件環(huán)。執(zhí)行和中到期的。 大家都知道,javascript是一門(mén)單線程語(yǔ)言,因此為了實(shí)現(xiàn)主線程的不阻塞,Event Loop這樣的方案應(yīng)運(yùn)而生。 瀏覽器和node中Event lo...
摘要:瀏覽器渲染進(jìn)程瀏覽器內(nèi)核進(jìn)程,內(nèi)部是多線程的默認(rèn)每個(gè)頁(yè)面一個(gè)進(jìn)程,互不影響。事件觸發(fā)線程歸屬于瀏覽器而不是引擎,用來(lái)控制事件循環(huán)可以理解成引擎自己都忙不過(guò)來(lái),需要瀏覽器另開(kāi)線程協(xié)助。 線程和進(jìn)程 進(jìn)程和線程的概念可以這樣理解: 進(jìn)程是一個(gè)工廠,工廠有它的獨(dú)立資源--工廠之間相互獨(dú)立--線程是工廠中的工人,多個(gè)工人協(xié)作完成任務(wù)--工廠內(nèi)有一個(gè)或多個(gè)工人--工人之間共享空間 工廠有多個(gè)工人...
摘要:瀏覽器渲染進(jìn)程瀏覽器內(nèi)核進(jìn)程,內(nèi)部是多線程的默認(rèn)每個(gè)頁(yè)面一個(gè)進(jìn)程,互不影響。事件觸發(fā)線程歸屬于瀏覽器而不是引擎,用來(lái)控制事件循環(huán)可以理解成引擎自己都忙不過(guò)來(lái),需要瀏覽器另開(kāi)線程協(xié)助。 線程和進(jìn)程 進(jìn)程和線程的概念可以這樣理解: 進(jìn)程是一個(gè)工廠,工廠有它的獨(dú)立資源--工廠之間相互獨(dú)立--線程是工廠中的工人,多個(gè)工人協(xié)作完成任務(wù)--工廠內(nèi)有一個(gè)或多個(gè)工人--工人之間共享空間 工廠有多個(gè)工人...
閱讀 629·2021-11-15 11:38
閱讀 1326·2021-10-11 10:59
閱讀 3545·2021-09-07 09:58
閱讀 533·2019-08-30 15:44
閱讀 3566·2019-08-28 18:14
閱讀 2645·2019-08-26 13:32
閱讀 3556·2019-08-26 12:23
閱讀 2458·2019-08-26 10:59