溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

node.js事件隊列的階段有哪些

發(fā)布時間:2021-12-10 09:42:52 來源:億速云 閱讀:162 作者:iii 欄目:web開發(fā)

本篇內(nèi)容主要講解“node.js事件隊列的階段有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“node.js事件隊列的階段有哪些”吧!

node.js事件隊列有6個階段:1、“timers”階段;2、“I/O callbacks”階段;3、“idle, prepare”階段;4、“poll”階段;5、“check”階段;6、“close callbacks”階段。

node.js事件隊列的階段有哪些

本教程操作環(huán)境:windows7系統(tǒng)、nodejs 12.19.0版,DELL G3電腦。

Node里的事件隊列和瀏覽器中的差異性還是比較大的,但是共同點就是宏任務和微任務的機制,是一樣的,如圖是關于node的宏任務與微任務分類。
node.js事件隊列的階段有哪些
nexttick會在node的每一次事件開啟時最先執(zhí)行(微任務最高優(yōu)先級)。

而關于node事件隊列可分為如下6個階段:
node.js事件隊列的階段有哪些

1、timers 階段:這個階段執(zhí)行timer(setTimeout、setInterval)的回調(diào)

2、I/O callbacks 階段:執(zhí)行一些系統(tǒng)調(diào)用錯誤,比如網(wǎng)絡通信的錯誤回調(diào)

3、idle, prepare 階段:僅node內(nèi)部使用

4、poll 階段:獲取新的I/O事件, 適當?shù)臈l件下node將阻塞在這里

5、check 階段:執(zhí)行 setImmediate() 的回調(diào)

6、close callbacks 階段:執(zhí)行 socket 的 close 事件回調(diào)

我們重點看timers、poll、check這3個階段就好,因為日常開發(fā)中的絕大部分異步任務都是在這3個階段處理的。

timers 階段

timers 是事件循環(huán)的第一個階段,Node 會去檢查有無已過期的timer,如果有則把它的回調(diào)壓入timer的任務隊列中等待執(zhí)行,事實上,Node 并不能保證timer在預設時間到了就會立即執(zhí)行,因為Node對timer的過期檢查不一定靠譜,它會受機器上其它運行程序影響,或者那個時間點主線程不空閑。比如下面的代碼,setTimeout() 和 setImmediate() 的執(zhí)行順序是不確定的。

setTimeout(() => {
  console.log('timeout')}, 0)setImmediate(() => {
  console.log('immediate')})

如上段代碼是個大坑,node無法確定每次事件隊列建立完畢的具體時間,可能這一次是5ms(timer被壓入棧,在第二輪才會執(zhí)行),下一次是1ms(timer在第一輪就被捕獲執(zhí)行了)。因此輸出結果順序不確定,這也是具體原因,而當嵌套一個異步的操作把他們包裹起來,就會100%保證immediate先執(zhí)行。

fs.readFile('./index.html',(err,result)=>{
	setTimeout(() => {
	  console.log('timeout')
	}, 0)
	
	setImmediate(() => {
	  console.log('immediate')
	})})

這是因為由于在第一輪未捕捉在timer,所以直接到了poll階段進行io的回調(diào)捕捉,當io結束后進入check階段,就會執(zhí)行immediate,而timeout會在第二輪最開始的timer執(zhí)行。

poll 階段

poll 階段主要有2個功能:
1.處理 poll 隊列的事件
2.當有已超時的 timer,執(zhí)行它的回調(diào)函數(shù)

even loop將同步執(zhí)行poll隊列里的回調(diào),直到隊列為空或執(zhí)行的回調(diào)達到系統(tǒng)上限(上限具體多少未詳),接下來even loop會去檢查有無預設的setImmediate(),分兩種情況:

1.若有預設的setImmediate(), event loop將結束poll階段進入check階段,并執(zhí)行check階段的任務隊列
2.若沒有預設的setImmediate(),event loop將阻塞在該階段等待

注意一個細節(jié),沒有setImmediate()會導致event loop阻塞在poll階段,這樣之前設置的timer豈不是執(zhí)行不了了?所以咧,在poll階段event loop會有一個檢查機制,檢查timer隊列是否為空,如果timer隊列非空,event loop就開始下一輪事件循環(huán),即重新進入到timer階段。

check 階段

setImmediate()的回調(diào)會被加入check隊列中, 從event loop的階段圖可以知道,check階段的執(zhí)行順序在poll階段之后。

到此,相信大家對“node.js事件隊列的階段有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI