nodejs事件循環
阿新 • • 發佈:2018-02-23
imm tint 時間 循環 rep clas close 如果 nod
1. 只有一個主線程,node開始執行腳本時,會先進事件循環初始化(同步任務,發出異步請求,規劃定時器生效時間,執行promise.nextTick等),這是事件循環還未開始。
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做不到真正的0ms,最少也需要1s;所以實際執行進入事件循環後,如果沒到1ms,那麽timers階段就會跳過進入check階段,所以執行順序不確定。
4. 異步任務分兩種:
本輪循環:promise.nextTick、promise的回調函數
次輪循環:setTimeout、setInteval、setImmediate的回調函數
nodejs事件循環