libuv核心開發者眼中的Node.js Event loop

文中提到的event loop均是指node.js中的。
通常網絡上講解的event loop,都會出現這張圖:node

clipboard.png

libuv的核心開發者Bert Belder以爲不太正確,他認爲下面這張圖更接近libuv的event loop原理,但也不徹底正確:網絡

clipboard.png

他認爲真正的event loop應該差很少是這樣的:異步

clipboard.png
clipboard.png
圖中左側分別有入口和出口箭頭,入口表明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

相關文章
相關標籤/搜索