成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【新手向】Node.js事件循環(huán)中的:Macrotask 與 Microtask

CoderDock / 1196人閱讀

摘要:一句話解釋在事件循環(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

事件循環(huán)機(jī)制詳解

從一個(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)文章

  • JS是單線程,你了解其運(yùn)行機(jī)制嗎?

    摘要:的單線程,與它的用途有關(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è)工人-工人之間共享...

    AlphaGooo 評(píng)論0 收藏0
  • 一篇文章教會(huì)你Event loop——瀏覽器和Node

    摘要:如果沒(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ì)比...

    Leck1e 評(píng)論0 收藏0
  • 理解瀏覽器和node.js中的Event loop事件循環(huán)

    摘要:瀏覽器和中并不一樣,瀏覽器的是在中定義的規(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...

    iliyaku 評(píng)論0 收藏0
  • 瀏覽器渲染機(jī)制

    摘要:瀏覽器渲染進(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è)工人...

    appetizerio 評(píng)論0 收藏0
  • 瀏覽器渲染機(jī)制

    摘要:瀏覽器渲染進(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è)工人...

    lncwwn 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<