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

圖解 Node.js 的核心 Event-loop

開發 前端
Node.js 是一個完完全全的消息驅動型模型。Node進程活著的最大意義是:有各種各樣的 Event 以及綁定在 Event 上面的Callback 和Data需要它(main thread 和 worker thread)處理。

這次我們來聊聊 Node.js 里面涉及到的一個核心概念:event-loop 。只有理解了它,才能明白 node 的進程模型,也才能明白異步調用在實現層面是什么樣子的,更能明白當同步代碼和異步代碼混雜在一起的時候,CPU 到底跑到我們代碼的哪一行了。文章分為兩篇:event-loop 篇和 Promise/Generator/async 篇。今天我們關注 event-loop 部分。

1、代碼思考

我寫了兩個函數,函數內部直接用 while(true){} 寫了一段死循環代碼。我們先來思考下面這段 Node.js code 執行結果是什么?很多人說 Node.js 是單線程的。如果是這樣,那 CPU 會不會陷入到 whileLoop_1() 的 while 循環里面出不來?

'use strict';
async function sleep(intervalInMS)
{
return new Promise((resolve,reject)=>{
setTimeout(resolve,intervalInMS);
});
}
async function whileLoop_1(){
while(true){
try {
console.log('new round of whileLoop_1');
await sleep(1000); // LINE-A
} catch (error) {
// ...
}
}
}
async function whileLoop_2(){
while(true){
try {
console.log('new round of whileLoop_2');
await sleep(1000); // LINE-B
} catch (error) {
// ...
}
}
}


whileLoop_1(); // LINE-C
whileLoop_2(); // LINE-D

不賣關子了,我先把執行結果發出來。

new round of whileLoop_1
new round of whileLoop_2
new round of whileLoop_1
new round of whileLoop_2
new round of whileLoop_1
new round of whileLoop_2
new round of whileLoop_1
new round of whileLoop_2
new round of whileLoop_1
new round of whileLoop_2
...

是的,正如你所見。這兩個 while 循環分別在交替執行, CPU 也沒有陷入到死循環里面出不來。那么問題來了:

  • CPU 執行到 LINE-A 的時候發生了什么使得它能成功脫身并有機會執行 whileLoop_2 ?
  • CPU 執行到 LINE-B 后,為什么又能回到 whileLoop_1 中繼續執行呢?

2、event-loop

在回答上面的問題前,我們需要先來看一個至關重要的概念:event-loop 。其實我們平時說 Node.js 是單線程僅僅是指 node 執行我們的 JS 代碼,更準確地說是 V8 執行 JS code 是發生在單線程里面的。實際上如果你打開 node 進程,會發現它有不少 worker thread。這是一個典型的單進程多線程模型。這些 worker thread 被放置于線程池里面,而 V8 執行 JS code 的線程被稱為主線程。主線程和線程池的配合關系如下圖所示。主線程負責執行 JS  code ,線程池里面的 worker thread 負責執行類似訪問 DB、訪問文件這樣的耗時費力的工作,它倆通過消息隊列協調工作。這和餐館工作流程類似。餐館由一個長得漂亮的小姐姐招呼客人落座并負責收集來自各個餐桌的點單。每當收到一個點好的菜單時,小姐姐會迅速地把它通過一個小窗口遞交給后廚。后廚那里有一個小看板,所有的點單都被陳列在看板上。廚師長根據訂單的時間和菜品安排不同的廚師燒菜。菜燒好后,再由小姐姐負責上菜。

圖片

圖 1:Node.js 單進程多線程模型

嗯上面這張圖還是太簡單了,用來騙新手可以,我知道滿足不了你們。我們把它放大一些。下圖中左邊是主線程,右邊是線程池和一個 worker thread,中間是消息隊列。

圖片

圖 2:Node.js 主線程和工作線程關系圖

(1)主線程

主線程只干一件事:拼命地執行 JS code,做 non-blocking I/O 操作。這些 JS code 既包含我們自己寫的,也包含我們所依賴的 npm package 。這里提到的 non-blocking I/O 操作意味著主線程干的事情基本上都是非阻塞型的工作,例如對 2+3 求和,迭代數組等。主線程以 tick 為粒度工作。是的,你一定聽說過 process.nextTick() ,所謂 next tick 就是下一次執行 tick 的時機。每個 tick 又包含若干個 phase ,按照 Node.js 官網介紹,目前為止一共有 6 個 Phase。

  • timers: 這個 phase 執行通過 setTimeout()? 和 setInterval() 所設置的 callback 函數。
  • pending callbacks: 這個 phase 執行一些與系統操作相關的 callback,比如建立 TCP 連接時收到的 ECONNREFUSED 相關的 callback 。
  • idle, prepare: 僅供Node.js內部使用。
  • poll: 從消息隊列里面獲取新的 I/O event,執行相應的 callback (不包括 setImmediate / close callback / 以及 timer 所設置的 callback)。
  • check: 執行通過 setImmediate()? 所設置的callback.
  • close callbacks: 執行一些 close callback ,比如通過這樣的代碼 socket.on('close', ...)? 所設置的 callback。

絕大部分情況下,這些 callback 是用 JS 寫的,Node 通過 Google V8 engine ,在主線程里面來執行這些 callback 。我們把上面的 6個 phase 和 tick 的關系放置到時間軸上,或許能更形象地說明主線程所做的工作。

圖片

圖 3:Node.js 主線程時序圖

(2)消息隊列

主線程不單單是在執行 JS code,也不僅僅只是在做 non-blocking I/O 操作。它在執行代碼的過程中,還會產生各種各樣的異步請求。直觀一點的如通過 setImmediate(callback[, ...args]) / fs.readFile(path[, options], callback) 產生,晦澀一點的如通過 Promise / async 產生。這些異步請求大部分情況下有一些共性:需要耗費一定的時間去處理。讓主線程放著其它事情不管,傻傻地干等這次操作的結果可不是聰明的做法。所以它們都會被封裝成 async Request,并被交給線程池去處理。還記得我們之前舉的餐館工作流程的例子嗎?燒菜是一個費時間的事情,如果小姐姐拿到我們的訂單,自己跑到后廚去燒菜會出現什么后果?等她把單子上的菜都燒好再去下一桌點菜的話,對客人而言就出現了一個 blocking I/O 操作:進餐館沒有人接待了。消息隊列就如同后廚那里的看板。小姐姐只負責往看板上添加新的訂單,而訂單的制作交由廚師團隊來完成。

(3)工作線程

工作線程來完成具體的 I/O 請求操作。通常這個過程藉由 OS 所提供的異步機制來完成。如 Windows 里面的 IO 完成端口(IOCP)、Linux 里面的異步 IO。如圖 2 所示,當工作線程完成了一個異步請求后,會把操作結果放置到一個消息隊列里面。從圖中可以看到,主線程運行所涉及到的每個 phase 都有各自專屬的消息隊列。消息隊列里面有了消息,意味著主線程又需要干活了,干活的過程中會繼續產生新的異步請求,工作線程繼續不知疲倦地搬磚。完美的閉環。有一種場景圖 2 并沒有畫出來,當 Node.js 收到來自系統外部的事件如網絡請求時,工作流程是什么樣子的?到目前為止我們談及的 event 都是由 JS code 主動觸發的,如果我們說這種 event 是由頂向下觸發的話,網絡請求這樣的 event 是由底向上觸發的。聰明的你一定可以在腦袋里大致畫出一條線出來:這條線的起點是位于內核的網卡驅動,終點是 Node.js 主線程,中間依次經過了內核協議棧,Node.js 的消息隊列。

3、小結

行文至此,可以看到 Node.js 是一個完完全全的消息驅動型模型。Node進程活著的最大意義是:有各種各樣的 event 以及綁定在 event 上面的 callback 和 data需要它(main thread 和 worker thread)處理。event 的 callback 中也可能會產生新的異步請求,進而產生新的 event 。正是這些源源不斷的 event 驅動著 Node 活下去。如果沒有event需要Node進程處理了,它也就沒有存在的必要了。Node.js 還是一個標準的單進行多線程模型。其中主線程用來執行我們所寫的 JS code ,而線程池里面的 worker thread 則用來執行各種耗時長的 I/O 操作。這些操作可能會導致 worker thread 被阻塞掉。worker thread 被阻塞沒有關系,但主線程被阻塞就不太美麗了。最后再強調一下:我們所寫的 JS code 是交由 V8 在單線程里面運行的,所以盡量不要在 JS code 里面執行耗時長的同步操作。

責任編輯:姜華 來源: 二哥聊云原生
相關推薦

2024-07-08 08:53:52

2014-03-07 13:43:32

Node.jsNode

2022-03-13 08:48:12

inspectorNode.js開發

2022-06-29 08:37:03

事件循環JS 語言

2013-11-01 09:34:56

Node.js技術

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2023-04-28 15:20:37

JavaScript事件循環

2021-12-25 22:29:57

Node.js 微任務處理事件循環

2012-02-03 09:25:39

Node.js

2020-05-29 15:33:28

Node.js框架JavaScript

2017-10-09 18:54:20

前端Node.js貢獻代碼

2011-11-01 10:30:36

Node.js

2011-09-08 13:46:14

node.js

2011-09-02 14:47:48

Node

2011-09-09 14:23:13

Node.js

2012-10-24 14:56:30

IBMdw

2011-11-10 08:55:00

Node.js

2022-02-12 20:33:29

Node.jsStreamfetch API

2025-07-21 01:00:00

UDP性能QPS

2021-11-06 18:40:27

js底層模塊
點贊
收藏

51CTO技術棧公眾號

久久国产婷婷国产香蕉| 国产精品巨作av| 亚洲天堂久久久久久久| 国产精品国产精品国产专区蜜臀ah| 久久精品国产亚洲av无码娇色| 欧洲亚洲一区二区三区| 欧美日韩亚州综合| 91网站在线观看免费| 性xxxxbbbb| 另类的小说在线视频另类成人小视频在线 | 欧洲一区二区视频| 懂色av一区二区三区在线播放| 国产老肥熟一区二区三区| 中文无字幕一区二区三区| 91精品国产自产在线老师啪| 国产在线综合网| av伊人久久| 亚洲精品在线观| www.cao超碰| 福利影院在线看| 国产精品理伦片| 精品免费国产| 精品久久无码中文字幕| 日本特黄久久久高潮| 九九久久综合网站| 精品一区二区三区蜜桃在线| 波多野结衣欧美| 欧美日韩国产123区| 一女被多男玩喷潮视频| 黄色av电影在线播放| 91麻豆高清视频| 成人高清在线观看| 97免费观看视频| 日韩在线一区二区| 97在线观看视频| 国产亚洲小视频| 一区二区三区中文| 这里精品视频免费| 欧美成人国产精品一区二区| 日韩超碰人人爽人人做人人添| 日韩欧美不卡在线观看视频| 亚洲精品性视频| 国产精品久久久久久久久免费高清 | 国产尤物在线观看| 亚洲另类视频| 97精品一区二区三区| 五月天丁香激情| 亚洲国产日韩欧美在线| 日韩视频免费大全中文字幕| av电影网站在线观看| 亚洲欧洲美洲国产香蕉| 日韩精品中文字幕有码专区| 在线观看国产三级| 色哟哟精品丝袜一区二区| 亚洲成人黄色网| 精品伦一区二区三区| 视频在线亚洲| 精品美女在线观看| 欧美熟妇精品一区二区| 亚洲高清999| 精品成a人在线观看| 成人啪啪18免费游戏链接| 日韩有吗在线观看| 精品国产第一区二区三区观看体验| 韩国一区二区三区四区| 成人av综合网| 日韩av在线电影网| 五月婷婷综合在线观看| 国产一区二区三区四区二区| 亚洲色图激情小说| youjizz亚洲女人| 欧美丰满日韩| 欧美日本亚洲视频| 日本一区二区网站| 视频一区视频二区中文字幕| 国产精品亚洲欧美导航| 99草在线视频| 波多野结衣亚洲一区| 久久久久久艹| 成人精品一区二区| 17c精品麻豆一区二区免费| 特色特色大片在线| 麻豆mv在线看| 欧美三级韩国三级日本三斤 | 成人精品免费网站| 欧美乱偷一区二区三区在线| 福利在线播放| 一区二区三区四区在线| av观看免费在线| 四虎影视成人精品国库在线观看| 日韩精品一区二区三区视频播放| 艳妇乳肉豪妇荡乳xxx| 久久99蜜桃| 欧美精品亚州精品| 在线观看日本视频| 国产在线精品不卡| 精品国产一区二区三区免费| аⅴ资源新版在线天堂| 亚洲欧美成人一区二区三区| 国产精品后入内射日本在线观看| 国产69精品久久久久按摩| 欧美大片在线观看一区二区| 自拍偷拍中文字幕| 亚洲国产精品久久久久蝴蝶传媒| 9.1国产丝袜在线观看 | 国产精品18p| 美女视频网站久久| 国产一区在线免费| 乱人伦中文视频在线| 粉嫩av一区二区三区免费野| 一级黄色片国产| 伊人久久综合影院| 欧美成人网在线| 亚洲 小说区 图片区| 成人综合婷婷国产精品久久| 亚洲一二区在线| 国产伦精品一区二区三区视频金莲| 91麻豆精品国产91| 色屁屁草草影院ccyy.com| 亚洲激情社区| 成人乱色短篇合集| av网在线观看| 日韩欧美一区二区在线| 少妇极品熟妇人妻无码| 亚洲第一偷拍| 国产热re99久久6国产精品| 你懂的视频在线观看| 亚洲第一久久影院| 成人在线短视频| 国产精品成人a在线观看| 茄子视频成人在线| 五月婷婷在线播放| 亚洲一区二区视频| 丰满少妇中文字幕| 亚洲欧美在线专区| 成人网欧美在线视频| 最新电影电视剧在线观看免费观看| 精品久久久久久国产91| 亚州av综合色区无码一区| 女同性一区二区三区人了人一 | 岛国精品一区| 欧美成人免费全部| 性生活黄色大片| 亚洲日本护士毛茸茸| 久久成年人网站| 久久社区一区| 成人黄在线观看| 黄色av电影在线观看| 欧美高清www午色夜在线视频| 久久九九视频| 久久久久国产精品免费网站| 亚洲国产精品字幕| 91精品国产91热久久久做人人| 欧美日韩一区二区在线| 一区二区三区四区高清精品免费观看| 久久精品水蜜桃av综合天堂| 国产亚洲精品aa| 国产成人综合亚洲91猫咪| 一本色道综合亚洲| 性猛交╳xxx乱大交| 欧美aa国产视频| 99porn视频在线| 免费网站在线观看人| 欧美成人女星排名| 日韩黄色一级大片| 久久尤物电影视频在线观看| 国产福利视频在线播放| 欧美日韩伦理| 亚洲最大av在线| 丰满的护士2在线观看高清| 亚洲国产一区自拍| 国产精品久免费的黄网站| 国产午夜亚洲精品理论片色戒| 国产理论在线播放| 午夜免费一区| 国产在线播放一区二区| 国产精品高清乱码在线观看| 一本色道久久88综合亚洲精品ⅰ| 亚洲影视一区二区| 亚洲一二三区在线观看| 成人精品在线观看视频| 蜜桃精品在线观看| 国产精品久久久久久久乖乖| 亚洲自拍电影| 亚洲一区二区三区sesese| av在线小说| 中文字幕在线日韩| 成人久久精品人妻一区二区三区| 日韩欧美在线字幕| 欧美大片xxxx| 久久综合狠狠综合久久激情| 手机在线国产视频| 亚洲一区二区三区高清| av不卡在线免费观看| 精品三级av在线导航| 国产精品久久久久久久电影| 欧美videosex性极品hd| 国产性色av一区二区| www.五月婷婷| 欧美偷拍一区二区| 日韩成年人视频| 国产精品久久久一本精品 | 亚洲精品自拍视频| 一区二区三区亚洲视频| 精品国产成人在线| 朝桐光av在线| 国产香蕉久久精品综合网| 日本特黄在线观看| 青青草97国产精品免费观看无弹窗版| 女人被男人躁得好爽免费视频| 精品国产91乱码一区二区三区四区 | 男女精品视频| 丰满女人性猛交| 日本在线中文字幕一区| 亚洲一区二区三区香蕉| 国产韩日精品| 欧美一级电影久久| 丁香花视频在线观看| 久久精品人人做人人爽| 国产午夜视频在线观看| 亚洲精品久久视频| jizz中国女人| 欧美精品xxxxbbbb| 中文字幕一区二区三区人妻四季| 疯狂欧美牲乱大交777| 久久久一区二区三区四区| 综合久久一区二区三区| 精品一区二区三区蜜桃在线| 久久综合九色综合欧美就去吻| 中文字幕99页| 成人一区二区在线观看| 国产一级片中文字幕| 紧缚奴在线一区二区三区| 天天爽人人爽夜夜爽| 久久精品亚洲| 精品国产成人av在线免| 久久成人亚洲| 情侣黄网站免费看| 亚洲在线电影| 国产无套内射久久久国产| 国产亚洲毛片| 日日碰狠狠添天天爽超碰97| 中文精品在线| 免费看国产曰批40分钟| 中文一区在线| 日韩av一二三四| 久久精品1区| 国产aaaaa毛片| 老司机精品视频在线| 国产精品一区二区小说| 久久99国产精品久久99果冻传媒| 天天干天天av| 国产精品一区二区果冻传媒| 北条麻妃亚洲一区| 成人妖精视频yjsp地址| 国产麻豆剧传媒精品国产av| eeuss国产一区二区三区 | 国产成人精品免费看视频| 欧美一区二区三区成人| 精品人妻一区二区三区麻豆91| 日韩美女在线视频| 天堂中文字幕av| 国产亚洲欧美aaaa| 免费黄色电影在线观看| 久久97久久97精品免视看| h片精品在线观看| 97香蕉超级碰碰久久免费软件 | 99久久无色码| 欧美激情影院| 香蕉久久免费影视| 久久精品久久久| 97超碰在线人人| 视频一区在线播放| 一区二区三区国产好的精华液| 国产高清无密码一区二区三区| 国产xxxx视频| 日本一区二区成人在线| 久久国产精品国语对白| 午夜视频一区二区三区| 波多野结衣网站| 日韩欧美精品在线视频| 色偷偷在线观看| 中文字幕av一区二区三区谷原希美 | 久久成人免费网站| 国产成人av片| 国产日韩欧美电影| 久久网一区二区| 一本到高清视频免费精品| 亚洲无码久久久久久久| 日韩精品一区二区在线| 九色在线视频蝌蚪| 欧美老少配视频| 欧美舌奴丨vk视频| 99久久久精品免费观看国产| 欧美午夜精品一区二区三区电影| 国产麻豆电影在线观看| 小嫩嫩精品导航| 无套白嫩进入乌克兰美女| 国产亚洲欧美日韩日本| 九九热精品免费视频| 欧美亚洲国产bt| 三级网站在线看| 久久av.com| 亚洲爱爱视频| 精品综合久久久| 欧美在线影院| 奇米视频888| 国产婷婷一区二区| 国产在线精品观看| 欧美精品99久久久**| 日产精品久久久久久久性色| 美女999久久久精品视频| 偷拍精品精品一区二区三区| 痴汉一区二区三区| 99精品网站| 免费看a级黄色片| 不卡av在线免费观看| 国产探花在线免费观看| 欧美视频在线不卡| 欧美精品少妇| 97色在线播放视频| 哺乳一区二区三区中文视频| 一区二区三区四区久久| 日韩二区三区在线观看| 成人手机在线免费视频| 亚洲午夜久久久久久久久电影院| 国产精品欧美久久久久天天影视 | bestiality新另类大全| 国产精品女人网站| 欧美猛男男男激情videos| 国产真人做爰毛片视频直播| 国产电影精品久久禁18| 欧美成人精品欧美一级| 91麻豆精品国产91久久久| 浪潮av一区| 91日本视频在线| 亚洲女同另类| 国内av免费观看| 亚洲男人的天堂在线aⅴ视频| 91av久久久| 久久精品久久久久久| 久久伊人国产| 一区二区三区日韩视频| 久久99热狠狠色一区二区| 久草福利资源在线| 欧美日产国产精品| 日本在线观看网站| 成人美女av在线直播| 亚洲免费二区| 岛国精品一区二区三区| 亚洲大片在线观看| 五月天婷婷社区| 日本国产一区二区三区| 中文字幕中文字幕精品| 日韩视频在线免费看| 中文字幕欧美日韩一区| 91女人18毛片水多国产| 久久久国产精品亚洲一区| 国产精品一区免费在线| 免费在线黄网站| 99视频一区二区三区| youjizz在线视频| 中文字幕亚洲二区| 精品久久亚洲| 青青青青在线视频| 91麻豆成人久久精品二区三区| 国产精品成人无码| 啊v视频在线一区二区三区| 欧美成人精品午夜一区二区| 欧美,日韩,国产在线| 久久日一线二线三线suv| 黄色大全在线观看| 久久视频国产精品免费视频在线| 亚洲成人偷拍| av动漫免费看| 亚洲视频 欧洲视频| 好吊色在线观看| 国产精品com| 亚洲综合五月| 国产精品300页| 欧美日韩激情一区二区| 免费看电影在线| 欧美日韩在线高清| 精品午夜久久福利影院 | 欧美三级在线看| 欧洲黄色一区| 日韩一区二区电影在线观看| 国产精品亚洲а∨天堂免在线| 97碰碰视频| 亚洲欧美综合7777色婷婷| 亚洲国产精品成人| 日韩欧美xxxx| 一区二区三区国产豹纹内裤在线| 人成在线免费视频| 亚洲影院在线看| 日韩avvvv在线播放| 久草视频手机在线观看| 一个色综合导航| 国产精品中文字幕制服诱惑| 一道本在线免费视频|