1. 程式人生 > >nodejs事件迴圈

nodejs事件迴圈

1. 只有一個主執行緒,node開始執行指令碼時,會先進事件迴圈初始化(同步任務,發出非同步請求,規劃定時器生效時間,執行promise.nextTick等),這時事件迴圈還未開始。

nodejs執行機制:
  1. V8引擎解析js指令碼
  2. 解析後的程式碼呼叫Node API
  3. 庫負責Node API的執行,它將不同的任務分配給不同的執行緒,形成一個Event Loop,以非同步的方式將任務的執行結果返回給V8引擎
  4. V8引擎再將結果返回給使用者

2.nodejs每一輪事件迴圈的六個階段(事件迴圈會無限次執行,直到非同步任務的回撥函式佇列清空才會停止執行):

  1. timers(處理setTimeoutsetInterval的回撥函式)
  2. I/O callbacks(除了setTimeoutsetIntervalsetImmediate、用於關閉請求的回撥函式)
  3. idlepreparelibuv內部使用)
  4. poll(等待還未返回的I/O事件)
  5. checksetImmediate
  6. close callbacks(執行關閉請求的回撥,如socket.on('close', ...)

3. setTimeoutsetImmediate

由於setTimeout第二個引數預設為0,但是加上node

做不到真正的0ms,最少也需要1s;所以實際執行進入事件迴圈後,如果沒到1ms,那麼timers階段就會跳過進入check階段,所以執行順序不確定。

4. 非同步任務分兩種:

本輪迴圈:promise.nextTickpromise的回撥函式

次輪迴圈:setTimeoutsetIntevalsetImmediate的回撥函式

  1. 多個process.nextTick語句總是在當前"執行棧"一次執行完,多個setImmediate可能則需要多次loop才能執行完;

6. 為什麼process.nextTick 永遠大於 promise.then?因為Node中,_tickCallback

在每一次執行完TaskQueue中的一個任務後被呼叫,而這個_tickCallback中實質上幹了兩件事:

  • nextTickQueue中所有任務執行掉(長度最大1e4,Node版本v6.9.1)
  • 第一步執行完後執行_runMicrotasks函式,執行microtask中的部分(promise.then註冊的回撥)