1. 程式人生 > >nodejs事件循環

nodejs事件循環

imm tint 時間 循環 rep clas close 如果 nod

1. 只有一個主線程,node開始執行腳本時,會先進事件循環初始化(同步任務,發出異步請求,規劃定時器生效時間,執行promise.nextTick等),這是事件循環還未開始。

2. nodejs每一輪事件循環的六個階段(事件循環會無限次執行,直到異步任務的回調函數隊列清空才會停止執行):

  1. timers(處理setTimeout和setInterval的回調函數)
  2. I/O callbacks(除了setTimeout、setInterval、setImmediate、用於關閉請求的回調函數)
  3. idle,prepare(libuv內部使用)
  4. poll(等待還未返回的I/O事件)
  5. check(setImmediate)
  6. close callbacks(執行關閉請求的回調,如socket.on(‘close‘, ...))

3. setTimeout和setImmediate:

由於setTimeout第二個參數默認為0,但是加上node做不到真正的0ms,最少也需要1s;所以實際執行進入事件循環後,如果沒到1ms,那麽timers階段就會跳過進入check階段,所以執行順序不確定。

4. 異步任務分兩種:

本輪循環:promise.nextTick、promise的回調函數

次輪循環:setTimeout、setInteval、setImmediate的回調函數

nodejs事件循環