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