文中提到的event loop均是指node.js中的。
通常網絡上講解的event loop,都會出現這張圖:node
libuv的核心開發者Bert Belder以爲不太正確,他認爲下面這張圖更接近libuv的event loop原理,但也不徹底正確:網絡
他認爲真正的event loop應該差很少是這樣的:異步
圖中左側分別有入口和出口箭頭,入口表明node js文件開始執行,出口表明執行完成;
黃色JS方塊表明同步JS的執行;
其餘圖標分別對應node.js官網中event loop的講解[1]socket
┌───────────────────────────┐ ┌─>│ timers │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ pending callbacks │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ idle, prepare │ │ └─────────────┬─────────────┘ ┌───────────────┐ │ ┌─────────────┴─────────────┐ │ incoming: │ │ │ poll │<─────┤ connections, │ │ └─────────────┬─────────────┘ │ data, etc. │ │ ┌─────────────┴─────────────┐ └───────────────┘ │ │ check │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ └──┤ close callbacks │ └───────────────────────────┘
鬧鐘圖標表明:timers (setTimeout, setInterval)
獨角獸圖標表明:poll
感嘆號圖標表明:check (setImmediately)
掃帚圖標表明:close callbacks(好比socket.on('close', callback))ide
每一個圖標是一種類型的callback任務隊列,圖標之間都會執行JS同步代碼;
同步代碼中出現異步的API時,對一個全局計數器ref++,而後交給相應圖標對應的模塊去處理;
處理完成以後放到對應的圖標中,同時對全局計數器ref--;
掃帚圖標(close callbacks)以後,若是ref爲0,則結束js運行,若是大於0,則繼續loop;oop
參考來源:
[1] Everything You Need to Know About Node.js Event Loop - Bert Belder
[2] The Node.js Event Loopui