精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美大陆国产| 飘雪影院手机免费高清版在线观看| 水蜜桃精品av一区二区| 7777精品伊人久久久大香线蕉的 | 在线看的av网站| 精品午夜久久福利影院| 久久久影视精品| 日本猛少妇色xxxxx免费网站| 成人污污视频| 欧美性猛交xxxxx免费看| 中文字幕不卡每日更新1区2区| 欧美视频xxx| 美女视频网站久久| 韩国v欧美v日本v亚洲| 精品人妻中文无码av在线 | av在线私库| 日本一区二区高清| 99在线国产| 亚洲av无码不卡| 激情婷婷久久| 日韩在线免费视频观看| 给我看免费高清在线观看| www.久久99| 色国产综合视频| 久草免费福利在线| 欧美激情午夜| www.亚洲人| 5g影院天天爽成人免费下载| 青青视频在线免费观看| 影音先锋中文字幕一区二区| 久久久精品一区二区| 少妇精品一区二区三区| 九九热播视频在线精品6| 欧美一区二区日韩| 亚洲 中文字幕 日韩 无码| 9999在线视频| 一区二区理论电影在线观看| 一本一道久久久a久久久精品91 | 黄页网站大全在线观看| av在线麻豆| 国产精品欧美一区喷水| 欧美日韩无遮挡| 黑人乱码一区二区三区av| 韩国v欧美v日本v亚洲v| 国产精品视频在线观看| 国产一区二区视频网站| 免费日韩精品中文字幕视频在线| 高清欧美性猛交| 欧美日韩国产精品一区二区三区| 国产精品国产一区| 日韩在线视频播放| 青青操在线播放| 欧美高清视频在线观看mv| 一本大道久久加勒比香蕉| 亚洲欧美色图视频| 偷拍视屏一区| 亚洲日韩中文字幕| 亚洲久久久久久久| 精品国产一区二区三区| 国产一区二区三区视频在线观看| 亚洲色成人网站www永久四虎| 国产精品密蕾丝视频下载| 亚洲区在线播放| 日韩一级av毛片| 精品视频免费| www.亚洲天堂| 欧美成欧美va| 亚洲黄色视屏| 欧美一级淫片播放口| 区一区二在线观看| 日本中文字幕一区二区有限公司| 国产精品久久久久久久美男| 夜夜嗨av禁果av粉嫩avhd| 美女www一区二区| 成人亚洲综合色就1024| 亚洲国产www| 91丝袜高跟美女视频| 欧美日韩精品免费观看视一区二区| 国产69精品久久app免费版| 中文字幕第一区| 好吊色这里只有精品| 日韩另类在线| 色婷婷亚洲婷婷| 免费涩涩18网站入口| 国产aa精品| 亚洲国产精品网站| 久久久久久久毛片| 女人天堂亚洲aⅴ在线观看| 久久久久久久999精品视频| 国产 日韩 欧美 在线| 日韩 欧美一区二区三区| 亚洲影院高清在线| 三级毛片在线免费看| 中文字幕的久久| 日韩黄色短视频| 丝袜美腿一区| 日韩视频在线观看一区二区| 成人免费av片| 欧美 日韩 国产精品免费观看| 91chinesevideo永久地址| 免费一级a毛片| 岛国精品在线播放| 日韩电影免费观看高清完整| 天天色天天射天天综合网| 91久久久免费一区二区| 日本中文字幕精品| 国产伦精品一区二区三区千人斩 | 水蜜桃一区二区| 国产精品实拍| 日韩欧美一区二区在线| 日韩欧美中文在线视频| 九九综合九九| 欧美激情喷水视频| 中文字幕 欧美激情| 丁香六月综合激情| 在线国产精品网| 久久青青视频| 日韩精品最新网址| 香蕉成人在线视频| 亚洲一卡久久| 国产欧美日韩伦理| 成年视频在线观看| 欧美性色aⅴ视频一区日韩精品| 最新国产精品自拍| 99欧美视频| 国产精品av在线播放| 天天射,天天干| 一区二区三区小说| 最新av免费在线观看| 国产精品中文字幕亚洲欧美| 2019日本中文字幕| 亚洲国产视频一区二区三区| 亚洲特黄一级片| 性生活免费在线观看| 国产精品一区二区三区av麻| 91国偷自产一区二区三区的观看方式| 国产熟女一区二区丰满| 国产精品色哟哟网站| 国产情侣av自拍| 国产成人调教视频在线观看 | 在线观看 亚洲| av影院午夜一区| 成人在线国产视频| 亚洲一区二区三区四区电影| 久久久精品电影| 91丨porny丨在线中文 | 夜鲁夜鲁夜鲁视频在线播放| 精品国产网站在线观看| 久久久久久久久久综合| 成人午夜碰碰视频| 91动漫在线看| 国产伦乱精品| 91超碰中文字幕久久精品| 人妻偷人精品一区二区三区| 亚洲午夜精品17c| 波多野结衣办公室双飞| 亚洲私人影院| 国产在线资源一区| 天堂资源在线| 亚洲欧美另类国产| 国产精华7777777| 国产精品久久三区| 亚洲一区二区在线视频观看| **女人18毛片一区二区| 91精品国产高清久久久久久91裸体 | 精品国产免费观看| 91蝌蚪porny九色| 国产性生交xxxxx免费| 日韩欧美一区二区三区免费看| 国产日韩专区在线| 四虎av在线| 亚洲精品国产精品国自产在线| 六月丁香激情综合| 国产女同互慰高潮91漫画| 亚洲另类第一页| 欧美日韩亚洲一区在线观看| 精品日本一区二区| 精品免费av在线 | 日韩激情小视频| 国产成人在线色| 女人和拘做爰正片视频| 日韩免费视频| 国产福利一区二区三区在线观看| 午夜激情电影在线播放| 影音先锋欧美精品| 亚洲爱爱综合网| 色综合天天在线| 小泽玛利亚一区二区免费| av不卡一区二区三区| 亚洲第一中文av| 亚洲视频免费| 亚洲精品8mav| 国产伦理久久久久久妇女 | 欧美成人免费在线视频| 五月婷婷久久久| 欧美精品成人一区二区三区四区| 国产精品99无码一区二区| 久久久久久免费网| 精产国品一区二区三区| 亚洲一区日韩| 久久久天堂国产精品| 自拍视频一区| 成人18视频| 亚洲精品一区三区三区在线观看| 欧美人交a欧美精品| 国产福利电影在线| 亚洲成人精品久久| 一级片在线免费观看视频| 午夜伦理一区二区| 久久精品一区二区三区四区五区| 99久久精品国产毛片| 国产一级免费大片| 欧美亚洲在线| 九九热只有这里有精品| 99久久婷婷国产综合精品电影√| 精品视频高清无人区区二区三区| 欧美不卡在线观看| 国产精品中文在线| 欧美成人免费电影| 国内精品小视频| 久草免费在线| 最好看的2019年中文视频| 日本福利片在线| 亚洲国产高清高潮精品美女| 99热这里只有精| 51午夜精品国产| 中文字幕免费播放| 欧美自拍丝袜亚洲| 日韩三级一区二区| 激情成人中文字幕| 伊人365影院| 洋洋成人永久网站入口| chinese全程对白| 国产精品欧美久久久久无广告| 免费在线观看你懂的| 成人国产精品免费观看视频| japan高清日本乱xxxxx| 国产原创一区二区三区| 亚洲精品久久久中文字幕| 日韩成人午夜精品| 亚洲乱码国产一区三区| 久久一区中文字幕| 青青草原成人网| 久久精品伊人| 欧美黄色一级片视频| 媚黑女一区二区| 少妇激情一区二区三区| 久久亚洲精选| wwww.国产| 另类中文字幕网| 亚洲午夜激情影院| 国产激情精品久久久第一区二区 | 欧美一区 二区| 久久久久九九九| 日本三级久久| 欧美日韩在线高清| 精品久久久中文字幕| 亚洲不卡1区| 婷婷亚洲综合| 欧美日韩中文字幕在线播放| 国内一区二区三区| 亚洲熟妇av日韩熟妇在线 | 亚洲18在线看污www麻豆| 九色|91porny| 韩国三级视频在线观看| av资源站一区| 久久成人激情视频| 国产精品伦理一区二区| 午夜剧场免费在线观看| 亚洲尤物视频在线| 欧美一区二区激情视频| 色88888久久久久久影院野外| 中文字幕人妻一区二区三区视频| 欧美绝品在线观看成人午夜影视| 国产绳艺sm调教室论坛| 欧美成人官网二区| 色吊丝在线永久观看最新版本| 亚洲深夜福利网站| 黄网页在线观看| 97人人爽人人喊人人模波多| 激情开心成人网| 91久久在线观看| 国产精品欧美大片| 日韩精品久久一区二区三区| 亚洲欧美日韩高清在线| 亚洲熟妇国产熟妇肥婆| 看国产成人h片视频| 性一交一黄一片| 国产人妖乱国产精品人妖| 国产97免费视频| 日韩欧美综合在线视频| 国产人妖一区二区| 日韩福利视频在线观看| 视频一区二区三区不卡| 午夜精品福利在线观看| www.国产精品| 国产亚洲一区二区三区在线播放| 欧美综合视频| 欧美亚洲日本一区二区三区 | 一区二区三区四区影院| 久久久久99精品国产片| 精品爆乳一区二区三区无码av| 色婷婷久久久久swag精品| 99国产精品一区二区三区| 亚洲美女精品成人在线视频| а√资源新版在线天堂| 日韩av片电影专区| 高潮按摩久久久久久av免费| 亚洲高清乱码| 小嫩嫩精品导航| 欧洲成人午夜精品无码区久久| 国产日韩欧美电影| 国产精品18p| 日韩视频一区二区| 69久久夜色| 日韩免费在线视频| 999久久精品| 黄瓜视频免费观看在线观看www | 国产精品白嫩初高中害羞小美女| 国产精品一区二区中文字幕| 中文字幕精品一区日韩| 日韩成人免费看| 中文字幕在线观看的网站| 亚洲免费在线视频一区 二区| 中日韩av在线| 亚洲女人天堂av| 日本三级一区| 国产一区二区三区四区五区加勒比| 在线成人激情| 激情文学亚洲色图| 国产精品沙发午睡系列990531| 亚洲自拍一区在线观看| 日韩精品丝袜在线| 黄色在线看片| 国产91亚洲精品一区二区三区| 亚洲一区二区| 亚洲黄色av片| 综合久久综合久久| 一级片在线免费观看视频| 深夜福利一区二区| 国产一区高清| 一区二区三区欧美成人| 美女国产一区二区三区| 国产探花视频在线| 欧美亚洲国产一区在线观看网站| 国产在线一二三| 国产成人一区二| 成人国产精品一级毛片视频| 免费裸体美女网站| 欧美激情综合五月色丁香| 一区二区视频网站| 日韩在线视频中文字幕| 成人污污视频| 日韩一级片免费视频| 成人国产在线观看| 国产又爽又黄的视频| 亚洲美女又黄又爽在线观看| 最新欧美色图| 香蕉久久夜色| 国产做a爰片久久毛片| 妺妺窝人体色www婷婷| 精品国产一区二区三区久久久蜜月| 97超碰在线免费| 欧美日韩免费观看一区| 麻豆成人91精品二区三区| www深夜成人a√在线| 日韩一级二级三级| 69av成人| 亚洲综合国产| 风间由美一二三区av片| 色综合久久久久综合体| 啊v在线视频| 91色琪琪电影亚洲精品久久| 欧美日本在线| 丰满大乳奶做爰ⅹxx视频 | 亚洲午夜精品久久久久久app| 国产无套精品一区二区三区| 欧美午夜精品久久久久久人妖| 国产在线观看免费| 92裸体在线视频网站| 99综合视频| jizz18女人高潮| 日韩欧美国产三级| 性欧美又大又长又硬| 亚洲自拍三区| av不卡一区二区三区| 国产女优在线播放| 欧美高清视频免费观看| 久久99国产精品视频| 一级片黄色免费| 欧美网站在线观看| 成人影院在线看| 美日韩免费视频| 国产麻豆一精品一av一免费| 亚洲第一精品在线观看| 久久电影一区二区| 自拍亚洲一区| 国产a级片视频| 欧美日韩国产一二三| 麻豆视频在线看|