nodejs事件迴圈
阿新 • • 發佈:2018-11-06
1. 只有一個主執行緒,node
開始執行指令碼時,會先進事件迴圈初始化(同步任務,發出非同步請求,規劃定時器生效時間,執行promise.nextTick
等),這時事件迴圈還未開始。
nodejs執行機制:
- V8引擎解析
js
指令碼 - 解析後的程式碼呼叫
Node API
- 庫負責
Node API
的執行,它將不同的任務分配給不同的執行緒,形成一個Event Loop
,以非同步的方式將任務的執行結果返回給V8引擎 - V8引擎再將結果返回給使用者
2.nodejs每一輪事件迴圈的六個階段(事件迴圈會無限次執行,直到非同步任務的回撥函式佇列清空才會停止執行):
timers
(處理setTimeout
和setInterval
的回撥函式)I/O callbacks
(除了setTimeout
、setInterval
、setImmediate
、用於關閉請求的回撥函式)idle
,prepare
(libuv
內部使用)poll
(等待還未返回的I/O
事件)check
(setImmediate
)close callbacks
(執行關閉請求的回撥,如socket.on('close', ...)
)
3. setTimeout
和setImmediate
:
由於setTimeout
第二個引數預設為0,但是加上node
timers
階段就會跳過進入check
階段,所以執行順序不確定。
4. 非同步任務分兩種:
本輪迴圈:promise.nextTick
、promise
的回撥函式
次輪迴圈:setTimeout
、setInteval
、setImmediate
的回撥函式
- 多個
process.nextTick
語句總是在當前"執行棧"一次執行完,多個setImmediate
可能則需要多次loop才能執行完;
6. 為什麼process.nextTick
永遠大於 promise.then
?因為Node
中,_tickCallback
TaskQueue
中的一個任務後被呼叫,而這個_tickCallback
中實質上幹了兩件事:
nextTickQueue
中所有任務執行掉(長度最大1e4,Node版本v6.9.1)- 第一步執行完後執行
_runMicrotasks
函式,執行microtask
中的部分(promise.then
註冊的回撥)