node.js 中的Event Loop的6個階段

node.js 中的Event Loop的6個階段

  • 1.timers:執行setTimeout() 和setInterview() 中到期的callbacks;
  • 2.I/O callbacks: 上一輪循環中在poll階段有少數的I/O callback,會被延遲到這一輪的這一階段執行;
  • 3.idle,prepare:僅內部使用;
  • 4.poll:最爲重要的階段,執行I/O callback ,在適當的條件下會阻塞在這個階段;
  • 5.check:執行setImmediate的callback;
  • 6.close callback: 執行close事件的callback,例如:socket.on('close',func);

node.js 中的event loop 每一次循環都要執行這6個階段。每一個階段都有本身的callback隊列,每當進入某個階段,都會從所屬的隊列中取出callback來執行,當隊列爲空或者被執行callback的數量達到系統的最大數量時候,進入下一階段。這六個階段都被執行完畢以後被稱爲一個循環。node

timer 階段

這一階段的callback是按照超時時間的順序來調用的,並非先進先出的隊列邏輯socket

I/O callbacks 階段

根據libuv的文檔,一些應該在上一輪循環poll階段執行的callback,由於某些緣由不能執行,就會被延遲到這一輪的循環的I/O callbacks 階段執行。這個階段執行的callbacks是上一輪殘留的。oop

idle,prepare 階段

在這階段使用了大量的宏(不作過多解釋)cdn

poll 階段

執行I/O callbackblog

check階段

執行setImmediate的callback;隊列

close階段

執行全部close事件的callbacks事件

process.nextTick在哪裏?

文檔中提到,process.nextTick()不屬於上面的任何一個階段,它在每一個階段結束的時候都會運行。而且優先與其餘microtask執行;文檔

microtask何時執行?

它在每一個階段結束的時候都會運行。而且優先級低於process.nextTick()執行;it

相關文章
相關標籤/搜索