精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

瀏覽器和 Node.js 的 EventLoop 為什么這么設計?

開發 前端
avaScript 是用于實現網頁交互邏輯的,涉及到 dom 操作,如果多個線程同時操作需要做同步互斥的處理,為了簡化就設計成了單線程,但是如果單線程的話,遇到定時邏輯、網絡請求又會阻塞住。怎么辦呢?

Event Loop 是 JavaScript 的基礎概念,面試必問,平時也經常談到,但是有沒有想過為什么會有 Event Loop,它為什么會這樣設計的呢?

今天我們就來探索下原因。

瀏覽器的 Event Loop

JavaScript 是用于實現網頁交互邏輯的,涉及到 dom 操作,如果多個線程同時操作需要做同步互斥的處理,為了簡化就設計成了單線程,但是如果單線程的話,遇到定時邏輯、網絡請求又會阻塞住。怎么辦呢?

可以加一層調度邏輯。把 JS 代碼封裝成一個個的任務,放在一個任務隊列中,主線程就不斷的取任務執行就好了。

每次取任務執行,都會創建新的調用棧。

其中,定時器、網絡請求其實都是在別的線程執行的,執行完了之后在任務隊列里放個任務,告訴主線程可以繼續往下執行了。

因為這些異步任務是在別的線程執行完,然后通過任務隊列通知下主線程,是一種事件機制,所以這個循環叫做 Event Loop。

這些在其他線程執行的異步任務包括定時器(setTimeout、setInterval),UI 渲染、網絡請求(XHR 或 fetch)。

但是,現在的 Event Loop 有個嚴重的問題,沒有優先級的概念,只是按照先后順序來執行,那如果有高優先級的任務就得不到及時的執行了。所以,得設計一套插隊機制。

那就搞一個高優先級的任務隊列就好了,每執行完一個普通任務,都去把所有高優先級的任務給執行完,之后再去執行普通任務。

有了插隊機制之后,高優任務就能得到及時的執行。

這就是現在瀏覽器的 Event Loop。

其中普通任務叫做 MacroTask(宏任務),高優任務叫做 MicroTask(微任務)。

宏任務包括:setTimeout、setInterval、requestAnimationFrame、Ajax、fetch、script 標簽的代碼。

微任務包括:Promise.then、MutationObserver、Object.observe。

怎么理解宏微任務的劃分呢?

定時器、網絡請求這種都是在別的線程跑完之后通知主線程的普通異步邏輯,所以都是宏任務。

而高優任務的這三種也很好理解,MutationObserver 和 Object.observe 都是監聽某個對象的變化的,變化是很瞬時的事情,肯定要馬上響應,不然可能又變了,Promise 是組織異步流程的,異步結束調用 then 也是很高優的。

這就是瀏覽器里的 Event Loop 的設計:設計 Loop 機制和 Task 隊列是為了支持異步,解決邏輯執行阻塞主線程的問題,設計 MicroTask 隊列的插隊機制是為了解決高優任務盡早執行的問題。

但是后來,JS 的執行環境不只是瀏覽器一種了,還有了 Node.js,它同樣也要解決這些問題,但是它設計出來的 Event Loop 更細致一些。

Node.js 的 Event loop

Node.js 是一個新的 JS 運行環境,它同樣要支持異步邏輯,包括定時器、IO、網絡請求,很明顯,也可以用 Event Loop 那一套來跑。

但是呢,瀏覽器那套 Event Loop 就是為瀏覽器設計的,對于做高性能服務器來說,那種設計還是有點粗糙了。

哪里粗糙呢?

瀏覽器的 Event Loop 只分了兩層優先級,一層是宏任務,一層是微任務。但是宏任務之間沒有再劃分優先級,微任務之間也沒有再劃分優先級。

而 Node.js 任務宏任務之間也是有優先級的,比如定時器 Timer 的邏輯就比 IO 的邏輯優先級高,因為涉及到時間,越早越準確;而 close 資源的處理邏輯優先級就很低,因為不 close 最多多占點內存等資源,影響不大。

于是就把宏任務隊列拆成了五個優先級:Timers、Pending、Poll、Check、Close。

解釋一下這五種宏任務:

Timers Callback:涉及到時間,肯定越早執行越準確,所以這個優先級最高很容易理解。

Pending Callback:處理網絡、IO 等異常時的回調,有的 *niux 系統會等待發生錯誤的上報,所以得處理下。

Poll Callback:處理 IO 的 data,網絡的 connection,服務器主要處理的就是這個。

Check Callback:執行 setImmediate 的回調,特點是剛執行完 IO 之后就能回調這個。

Close Callback:關閉資源的回調,晚點執行影響也不到,優先級最低。

所以呢,Node.js 的 Event Loop 就是這樣跑的了:

還有一點不同要特別注意:

Node.js 的 Event Loop 并不是瀏覽器那種一次執行一個宏任務,然后執行所有的微任務,而是執行完一定數量的 Timers 宏任務,再去執行所有微任務,然后再執行一定數量的 Pending 的宏任務,然后再去執行所有微任務,剩余的 Poll、Check、Close 的宏任務也是這樣。

為什么這樣呢?

其實按照優先級來看很容易理解:

假設瀏覽器里面的宏任務優先級是 1,所以是按照先后順序依次執行,也就是一個宏任務,所有的微任務,再一個宏任務,再所有的微任務。

而 Node.js 的 宏任務之間也是有優先級的,所以 Node.js 的 Event Loop 每次都是把當前優先級的所有宏任務跑完再去跑微任務,然后再跑下一個優先級的宏任務。

也就是是一定數量的 Timers 宏任務,再所有微任務,再一定數量的 Pending Callback 宏任務,再所有微任務這樣。

為什么說是一定數量呢?

因為如果某個階段宏任務太多,下個階段就一直執行不到了,所以有個上限的限制,剩余的下個 Event Loop 再繼續執行。

除了宏任務有優先級,微任務也劃分了優先級,多了一個 process.nextTick 的高優先級微任務,在所有的普通微任務之前來跑。

所以,Node.js 的 Event Loop 的完整流程就是這樣的:

  • Timers 階段:執行一定數量的定時器,也就是 setTimeout、setInterval 的 callback,太多的話留到下次執行
  • 微任務:執行所有 nextTick 的微任務,再執行其他的普通微任務
  • Pending 階段:執行一定數量的 IO 和網絡的異常回調,太多的話留到下次執行
  • 微任務:執行所有 nextTick 的微任務,再執行其他的普通微任務
  • Idle/Prepare 階段:內部用的一個階段
  • 微任務:執行所有 nextTick 的微任務,再執行其他的普通微任務
  • Poll 階段:執行一定數量的文件的 data 回調、網絡的 connection 回調,太多的話留到下次執行。如果沒有 IO 回調并且也沒有 timers、check 階段的回調要處理,就阻塞在這里等待 IO 事件
  • 微任務:執行所有 nextTick 的微任務,再執行其他的普通微任務
  • Check 階段:執行一定數量的 setImmediate 的 callback,太多的話留到下次執行。
  • 微任務:執行所有 nextTick 的微任務,再執行其他的普通微任務
  • Close 階段:執行一定數量的 close 事件的 callback,太多的話留到下次執行。
  • 微任務:執行所有 nextTick 的微任務,再執行其他的普通微任務

比起瀏覽器里的 Event Loop,明顯復雜了很多,但是經過我們之前的分析,也能夠理解:

Node.js 對宏任務做了優先級劃分,從高到低分別是 Timers、Pending、Poll、Check、Close 這 5 種,也對微任務做了劃分,也就是 nextTick 的微任務和其他微任務。執行流程是先執行完當前優先級的一定數量的宏任務(剩下的留到下次循環),然后執行 process.nextTick 的微任務,再執行普通微任務,之后再執行下個優先級的一定數量的宏任務。。這樣不斷循環。其中還有一個 Idle/Prepare 階段是給 Node.js 內部邏輯用的,不需要關心。

改變了瀏覽器 Event Loop 里那種一次執行一個宏任務的方式,可以讓高優先級的宏任務更早的得到執行,但是也設置了個上限,避免下個階段一直得不到執行。

還有一個特別要注意的點,就是 poll 階段:如果執行到 poll 階段,發現 poll 隊列為空并且 timers 隊列、check 隊列都沒有任務要執行,那么就阻塞的等在這里等 IO 事件,而不是空轉。 這點設計也是因為服務器主要是處理 IO 的,阻塞在這里可以更早的響應 IO。

完整的 Node.js 的 Event Loop 是這樣的:

對比下瀏覽器的 Event Loop:

兩個 JS 運行環境的 Event Loop 整體設計思路是差不多的,只不過 Node.js 的 Event Loop 對宏任務和微任務做了更細粒度的劃分,也很容易理解,畢竟 Node.js 面向的環境和瀏覽器不同,更重要的是服務端對性能的要求會更高。

總結

JavaScript 最早是用于寫網頁交互邏輯的,為了避免多線程同時修改 dom 的同步問題,設計成了單線程,又為了解決單線程的阻塞問題,加了一層調度邏輯,也就是 Loop 循環和 Task 隊列,把阻塞的邏輯放到其他線程跑,從而支持了異步。然后為了支持高優先級的任務調度,又引入了微任務隊列,這就是瀏覽器的 Event Loop 機制:每次執行一個宏任務,然后執行所有微任務。

Node.js 也是一個 JS 運行環境,想支持異步同樣要用 Event Loop,只不過服務端環境更復雜,對性能要求更高,所以 Node.js 對宏微任務都做了更細粒度的優先級劃分:

Node.js 里劃分了 5 種宏任務,分別是 Timers、Pending、Poll、Check、Close。又劃分了 2 種微任務,分別是 process.nextTick 的微任務和其他的微任務。

Node.js 的 Event Loop 流程是執行當前階段的一定數量的宏任務(剩余的到下個循環執行),然后執行所有微任務,一共有 Timers、Pending、Idle/Prepare、Poll、Check、Close 6 個階段。

其中 Idle/Prepare 階段是 Node.js 內部用的,不用關心。

特別要注意的是 Poll 階段,如果執行到這里,poll 隊列為空并且 timers、check 隊列也為空,就一直阻塞在這里等待 IO,直到 timers、check 隊列有回調再繼續 loop 。

Event Loop 是 JS 為了支持異步和任務優先級而設計的一套調度邏輯,針對瀏覽器、Node.js 等不同環境有不同的設計(主要是任務優先級的劃分粒度不同),Node.js 面對的環境更復雜、對性能要求更高,所以 Event Loop 設計的更復雜一些。

 

責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2021-12-08 07:55:41

EventLoop瀏覽器事件

2012-03-09 09:11:29

Node.js

2022-12-22 07:44:04

2012-05-02 15:56:20

PHP

2021-09-03 13:42:54

Node.js異步性能

2020-09-15 08:26:25

瀏覽器緩存

2018-04-22 00:01:43

JavaScript Node 語言

2011-09-02 14:47:48

Node

2016-05-18 10:15:25

PythonNode.js

2023-01-10 14:11:26

2023-09-08 14:12:04

2011-12-23 13:58:57

node.js

2012-06-04 10:35:55

FirefoxChrome瀏覽器

2011-02-22 09:50:21

2020-10-20 09:12:57

axios核心原理

2022-06-13 21:52:02

CDN網絡節點

2022-07-20 11:36:47

瀏覽器代碼

2021-09-26 05:04:45

瀏覽器AppActivity

2013-11-01 09:34:56

Node.js技術

2015-03-10 10:59:18

Node.js開發指南基礎介紹
點贊
收藏

51CTO技術棧公眾號

91国内精品久久久| 99久久精品免费视频| 第一中文字幕在线| 久久中文字幕电影| 91精品久久久久久久久久久久久久| fc2ppv在线播放| 欧美三级午夜理伦三级在线观看| 欧美综合一区二区| 久久久无码中文字幕久...| 高清国产mv在线观看| 亚洲永久视频| 久久成人国产精品| 黄色在线观看av| 国内精品视频| 91久久精品网| 成人免费在线网| 888av在线| 99热精品一区二区| 成人免费直播live| 亚洲影院在线播放| 欧美视频久久| 最近免费中文字幕视频2019| 人妻在线日韩免费视频| 97精品资源在线观看| 欧美性xxxxhd| 91成人综合网| 黄色网页在线看| 中文字幕精品三区| 精品国产一区二区三区麻豆小说 | 亚洲一区精品视频| 香蕉视频免费看| 国产成人啪午夜精品网站男同| 国产成人精品视频在线观看| 日韩福利片在线观看| 四季av一区二区凹凸精品| 日韩国产在线播放| 欧美极品jizzhd欧美仙踪林| 自拍偷拍亚洲| 欧洲激情一区二区| 亚洲爆乳无码专区| 麻豆mv在线看| 亚洲伊人色欲综合网| 伊人婷婷久久| 91青青在线视频| 久久久久久久久一| 久久综合久久久| 日韩在线观看视频网站| 国产+成+人+亚洲欧洲自线| 国产色婷婷国产综合在线理论片a| 欧美 日韩 精品| 国产亚洲网站| 欧美在线激情网| 久久免费激情视频| 欧美亚洲自偷自偷| 国产成人91久久精品| 亚洲GV成人无码久久精品| 在线视频亚洲| 日本一区二区在线播放| 久久青青草原亚洲av无码麻豆| 国产欧美在线| 日本亚洲精品在线观看| 中文字幕 国产精品| 老牛影视一区二区三区| 国产精品都在这里| 国产一区二区三区黄片| 狠狠色丁香九九婷婷综合五月| 国产欧美日韩91| 国产精品久久久国产盗摄| 精品亚洲国内自在自线福利| 成人激情春色网| 精品久久国产视频| 成人精品小蝌蚪| 久久久人人爽| 福利在线视频导航| 中国av一区二区三区| 男人的天堂成人| 日韩免费影院| 五月天亚洲精品| 在线看的黄色网址| 国内精品视频| 精品亚洲夜色av98在线观看| 69精品无码成人久久久久久| 久久中文视频| 久久久久久久久亚洲| 国产区一区二区三| 蜜臀精品一区二区三区在线观看| 成人激情视频在线观看| 欧洲av在线播放| 国产日韩v精品一区二区| 一区二区三视频| bl在线肉h视频大尺度| 色哟哟一区二区在线观看| 9l视频白拍9色9l视频| 一本一道久久a久久| 亚洲毛片在线观看.| 极品美妇后花庭翘臀娇吟小说| 国产一区二区三区自拍| 国产成人涩涩涩视频在线观看| 97国产精品久久久| 久久在线观看免费| 大陆极品少妇内射aaaaaa| 国内激情视频在线观看| 欧美精品少妇一区二区三区| 99久久人妻精品免费二区| 日韩国产一区二区| 97视频在线免费观看| 这里只有精品9| 99精品桃花视频在线观看| 在线播放 亚洲| 日韩在线影院| 亚洲国产成人久久综合一区| 亚洲国产精品一区二区久久hs| 99亚洲伊人久久精品影院红桃| 国产精品一区二区久久久久| 神马亚洲视频| 一区二区三区精品视频在线| 亚洲色图久久久| 亚洲第一论坛sis| 欧美激情精品久久久久久大尺度| 中文在线免费观看| 99久久国产综合色|国产精品| 亚洲自拍偷拍一区二区三区| 天然素人一区二区视频| 日韩电影在线观看永久视频免费网站| 日本裸体美女视频| 久久久久久一区二区| 国产日产精品一区二区三区四区| 黄网站免费在线播放| 欧美专区亚洲专区| 久久精品成人av| 亚洲免费观看| 国产精品日韩高清| av免费在线免费观看| 欧美日韩一区二区电影| 一区二区黄色片| 国产视频亚洲| 精品午夜一区二区| 国产调教在线| 欧美一区二区三级| 夫妻性生活毛片| 狠狠v欧美v日韩v亚洲ⅴ| 日韩一区免费观看| 欧美电影免费观看高清完整| 日韩成人在线网站| 久草国产精品视频| 99久久精品国产导航| 日韩中字在线观看| 久久精品论坛| 91成人精品网站| 婷婷丁香花五月天| 欧美性色xo影院| 国产成人精品无码免费看夜聊软件| 日韩亚洲国产精品| 精品无码久久久久国产| 天堂电影一区| 亚洲久久久久久久久久| 天堂网视频在线| 日本一区二区三区视频视频| 狠狠热免费视频| 9999国产精品| 9a蜜桃久久久久久免费| 黄色的视频在线观看| 亚洲成色www8888| 久久久午夜影院| 26uuu精品一区二区在线观看| 日韩一级在线免费观看| 日本午夜一区| 亚洲a区在线视频| 丁香花在线影院| 亚洲欧洲av一区二区| 欧美日韩 一区二区三区| 国产精品第13页| 国产又粗又猛又爽又黄| 影音先锋国产精品| 日本不卡二区| 日本成人在线网站| 色综合久久88| 神马电影在线观看| 欧美色视频在线观看| 久久国产精品国语对白| 成人精品鲁一区一区二区| 成人在线观看a| 99国产精品免费视频观看| 成人h视频在线观看| 在线天堂资源| 久久精品国产电影| 午夜在线视频免费| 欧美日本一区二区三区| 久久久精品国产sm调教网站| 国产亚洲成年网址在线观看| 手机免费看av网站| 最新亚洲一区| 欧美亚洲视频一区| 欧美调教视频| 亚洲影影院av| 亚洲校园激情春色| 欧美日韩国产成人在线| 欧美性孕妇孕交| 欧美一区二区视频观看视频| 国产精品人人人人| 亚洲欧美日韩国产综合| 加勒比一区二区| 国产黑丝在线一区二区三区| 国产综合免费视频| 一区二区三区在线| 三级三级久久三级久久18| 成人av动漫| 国产免费一区视频观看免费 | 亚洲蜜臀av乱码久久精品| 性欧美丰满熟妇xxxx性久久久| 精品一区二区三区在线观看国产 | 精品在线播放免费| 日韩久久一级片| 黄色国产精品| 在线一区亚洲| 日韩在线综合| 欧美日韩在线播放一区二区| 国产精品x8x8一区二区| 成人做爽爽免费视频| 日韩av超清在线观看| 69久久夜色精品国产69乱青草| 黄色网页在线观看| 日韩在线视频免费观看高清中文| 神马电影在线观看| 亚洲第一在线视频| www.色视频| 欧美一区二区三区性视频| www.五月婷婷.com| 91福利小视频| 极品国产91在线网站| 黄色成人av网| 中文字幕在线字幕中文| 亚洲一区在线看| 亚洲天堂黄色片| 国产精品美女久久久久久久久 | 国内精品国产成人国产三级| 欧美午夜精品电影| 中文字幕欧美人妻精品| 日本二三区不卡| 波多野结衣日韩| 在线视频欧美区| 波多野结衣黄色| 欧美在线制服丝袜| 中文字幕日本人妻久久久免费| 日韩欧美a级成人黄色| av中文在线播放| 色综合一个色综合| 在线观看 亚洲| 欧美日韩一区二区免费视频| 五月婷婷开心网| 婷婷亚洲久悠悠色悠在线播放| 国产真实乱人偷精品视频| 亚洲国产裸拍裸体视频在线观看乱了| 免费无码毛片一区二区app| 亚洲精品伦理在线| 久草视频免费播放| 欧美日韩国产精品| 成人在线免费看视频| 色就色 综合激情| 18国产免费视频| 欧美精品色综合| wwwxxxx国产| 日韩极品精品视频免费观看| 欧美成熟毛茸茸| 在线电影欧美日韩一区二区私密| 97超碰人人在线| 久久91亚洲精品中文字幕| 日本h片在线观看| 69久久夜色精品国产69| yy6080久久伦理一区二区| 成人h视频在线观看播放| 91精品久久久久久综合五月天 | 五月天婷婷视频| 亚洲天堂男人的天堂| 毛片在线看网站| 久久久久久91| 国产欧美一区二区三区精品酒店| 国产福利视频一区二区| 国产精品日本一区二区不卡视频| 翡翠波斯猫1977年美国| 综合色就爱涩涩涩综合婷婷| 青春草在线视频免费观看| 激情丁香综合| 亚洲 中文字幕 日韩 无码| 国产一区在线看| 成人免费无码大片a毛片| 国产精品视频线看| 在线看成人av| 欧美日韩久久久久久| 国精产品乱码一区一区三区四区| 亚洲精品网址在线观看| 国产在线观看91| 国语自产精品视频在线看一大j8| 日韩精品一区二区三区| av一区二区三区四区电影| 国产欧美日韩在线观看视频| 欧美另类videosbestsex日本| 久久精品欧洲| 肉丝美足丝袜一区二区三区四| 国产欧美va欧美不卡在线 | 一本色道综合亚洲| 99国产在线播放| 亚洲天堂男人的天堂| a毛片不卡免费看片| 国产综合福利在线| 日韩手机在线| 国产高清不卡无码视频| 蜜桃传媒麻豆第一区在线观看| 中文文字幕文字幕高清| 亚洲视频 欧洲视频| 男人天堂视频在线| 亚洲成人精品视频在线观看| 激情视频在线观看| 国产精品成人一区二区| 老司机精品在线| 国产精品一二三在线观看| 肉色丝袜一区二区| 免费看三级黄色片| 亚洲视频你懂的| 中文字幕一区二区三区四区免费看| 亚洲白拍色综合图区| 97caopor国产在线视频| 国产免费观看久久黄| 国产中文字幕一区二区三区 | 亚洲综合网在线| 欧洲精品在线观看| 国产小视频在线观看| 欧美一级电影久久| 成人直播在线观看| 8x8ⅹ国产精品一区二区二区| 狠狠色综合色综合网络| 天天摸日日摸狠狠添| 懂色av中文一区二区三区天美| 亚洲精品国产精品乱码不卡| 久久综合网hezyo| 亚洲伊人伊成久久人综合网| 视频一区视频二区视频三区视频四区国产| 亚洲一区二区伦理| 波多野结衣有码| 五月激情六月综合| 天天摸夜夜添狠狠添婷婷| 欧美精品激情在线观看| 911精品国产| 黄色一级在线视频| 99久久精品免费看| 青草视频在线观看免费| 亚洲精品一区二区网址| 成人欧美magnet| 日韩精品久久久毛片一区二区| 美女诱惑一区| 老司机福利在线观看| 欧美亚洲愉拍一区二区| 亚洲精品传媒| 亚洲影视中文字幕| 1024成人| 国产呦小j女精品视频| 色综合久久综合网欧美综合网| 国产美女视频一区二区三区| 国产精品久久二区| 日韩精品一区二区久久| 亚洲网中文字幕| 亚洲一区二区在线视频| 手机看片一区二区| 日韩av电影免费观看高清| 精品久久久久久久久久久下田 | 成人免费黄色大片| 欧美一区二区三区四区夜夜大片| 玖玖玖视频精品| 丝袜人妻一区二区三区| 久久丝袜美腿综合| 亚洲无码久久久久久久| 九九热精品在线| 亚洲第一福利社区| 国产aⅴ爽av久久久久| 亚洲综合另类小说| 日韩一区av| 国产欧美日韩免费看aⅴ视频| 欧美成人首页| 在线免费观看成年人视频| 欧美日韩成人在线一区| 久久一卡二卡| 欧洲精品久久| 国产乱码精品1区2区3区| 中文字幕一区二区三区精品| 中文字幕亚洲欧美日韩高清| 久久伊人影院| 成熟老妇女视频| 亚洲欧美日韩综合aⅴ视频| 蜜桃久久一区二区三区| 国产精品91一区| 欧美日韩18| 日韩中文字幕有码| 日韩欧美国产综合在线一区二区三区 | 激情综合色丁香一区二区| 久久免费视频6| 日韩资源在线观看| 人人香蕉久久| 亚洲欧美日韩中文字幕在线观看| 欧美性xxxxx极品娇小| 中文字幕中文字幕在线十八区|