[Node.js Under the Hood] Node.js 事件輪詢

根據這里整理所得

問題點

當前 Web Server 處理一個請求時多數時間被消耗在等待磁盤I/O及網絡延遲上

解決方案

比較傳統(tǒng)的解決方法是:程序員在編碼時開一個新的線程來處理需要消耗大量等待時間的操作。但這樣帶來的問題是更加程序復雜性度蜕该,對程序員編碼不友好凤跑。Node 通過基于事件輪詢的回調機制來解決該問題。

Node.js 事件輪詢

當程序調用了一段非阻塞的操作時惭适,Node 在低層開一個新的線程與主線程同時運行,一旦該隱藏線程的操作處理完成后,會將所得結果交由相應的回調函數處理。Node 通過 libuv 庫來處理異步 I/O 線程的調度問題昧捷。

任務隊列

javascript 是一種單線程、事件驅動的語言罐寨。所以需要通過事件的監(jiān)聽這種方式來處理多任務靡挥。即當事件被觸發(fā)時,程序調用事前提供的回調函數來處理該事件衩茸。而這些回調函數本身也能通過隊列來處理多任務芹血。

但我們只有一個主線程和一個回調棧,所以一個任務的回調函數需要等待執(zhí)行棧為空(即無任務--阻塞代碼在執(zhí)行)的時候才能執(zhí)行楞慈,從而形成了一個任務隊列幔烛。當主線程完成它的上一個任務時,可執(zhí)行的回調函數(如果有)總會被調起囊蓝,如此循環(huán)往復饿悬,故稱為事件輪詢。

微任務和大任務

Node 中包含兩種任務隊列來分別存放兩種類型的任務聚霜。

微任務包括:process.nextTick, promises, Object.observe
大任務包括:setTimeout, setInterval, setImmediate, I/O

基于 WHATVG 規(guī)范狡恬,事件輪詢的一個周期只處理大任務隊列中的一個大任務。在這個周期內蝎宇,當大任務處理完成后弟劲,他下面微任務列表中可執(zhí)行的微任務才可以依次執(zhí)行。只有當該微任務隊列中的可執(zhí)行的微任務執(zhí)行完后姥芥,事件輪詢才可以進入下一個周期兔乞。

任務隊列的執(zhí)行順序

最后

在 async/await 尚未成為標準之前可通過 co 或者 koa 來處理異步操作的 callback hell 問題,當然也可以通過 async.js 來解決凉唐。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末庸追,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子台囱,更是在濱河造成了極大的恐慌淡溯,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件簿训,死亡現場離奇詭異咱娶,居然都是意外死亡,警方通過查閱死者的電腦和手機强品,發(fā)現死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門豺总,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人择懂,你說我怎么就攤上這事喻喳。” “怎么了困曙?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵表伦,是天一觀的道長。 經常有香客問我慷丽,道長蹦哼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任要糊,我火速辦了婚禮纲熏,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己局劲,他們只是感情好勺拣,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鱼填,像睡著了一般药有。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苹丸,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天愤惰,我揣著相機與錄音,去河邊找鬼赘理。 笑死宦言,一個胖子當著我的面吹牛,可吹牛的內容都是我干的商模。 我是一名探鬼主播蜡励,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼阻桅!你這毒婦竟也來了凉倚?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤嫂沉,失蹤者是張志新(化名)和其女友劉穎稽寒,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體趟章,經...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡杏糙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了蚓土。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宏侍。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蜀漆,靈堂內的尸體忽然破棺而出谅河,到底是詐尸還是另有隱情,我是刑警寧澤确丢,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布绷耍,位于F島的核電站,受9級特大地震影響鲜侥,放射性物質發(fā)生泄漏褂始。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一描函、第九天 我趴在偏房一處隱蔽的房頂上張望崎苗。 院中可真熱鬧狐粱,春花似錦、人聲如沸胆数。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幅慌。三九已至宋欺,卻和暖如春轰豆,著一層夾襖步出監(jiān)牢的瞬間胰伍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工酸休, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留骂租,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓斑司,卻偏偏與公主長得像渗饮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宿刮,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容