Node.js 事件循環機制

概述

Node.js 僅有一個主線程用於執行所有用户的操作,使用事件循環機制(Event Loop)實現高併發和高效率的處理。

Timers階段

在Timers階段,服務器處理setTimeout和setInterval,因此,這兩種函數實際上並不是完全按照時間執行,而是在指定時間延遲一點之後才會執行,即到事件循環到Timers階段之後執行。

Pending callbacks階段

該階段處理系統級別的I/O錯誤回調,如TCP連接失敗,這個階段不常用。

Idle / Prepare階段

該階段供系統內部開發使用,與一般的開發者沒有關聯。

Poll階段

Poll階段是Node執行事件循環中最核心的階段,幾乎所有事件都在此處完成,包括執行已經完成的I/O的回調操作,該階段是可以阻塞的,如果某個I/O的回調尚未執行完成,事件循環會始終阻塞在Poll階段而不會進入下一個階段。
在沒有Timer等其他任務的情況下,系統將停留在Poll階段等待I/O完成從而執行其回調。

Check階段

Chec階段主要用於解決setImmediate的操作,該操作在Check階段執行,因此setImmediate的運行時間永遠提前於setImmediate和setInterval,即使是0秒延遲的setImmediate和setInterval也會在setImmediate方法之後操作,因為事件循環會在完成Poll之後首先進入Check階段,而在下一輪事件循環之後才會進入Timer階段。

Close callback階段

該階段執行關閉類的事件,如關閉網絡連接等任務。

微任務

在Node中,微任務的執行比宏任務的優先級更高,系統會在每個階段執行完以後把所有微任務執行完,然後才進入下一階段。例如process.nextTick就屬於微任務中的方法,其優先級最高,其次是也位於微任務隊列中的Promise.then方法,而setImmediate和setTimeout(0)都屬於宏任務,執行的時間永遠比process.nextTick和promise.then靠後。