1. 程式人生 > 實用技巧 >node的環境下的事件輪詢機制

node的環境下的事件輪詢機制

事件輪詢

維持主執行緒執行的迴圈就是事件輪詢,存在於主執行緒中,負責不停的呼叫開發者編寫的程式碼

第一階段:timers(定時器階段)

--此階段由setTimeout()和安排的回撥setInterval()

--輪詢階段控制定時器的執行時間

第二階段:pending callbacks (系統階段)

--執行推遲到下一個階段迭代的I/O回撥

第三階段:idle,prepare(準備階段)

第四階段:poll(輪詢階段,核心)

--輪詢佇列不為空,佇列中有回撥函式

從佇列中取出回撥函式,同步執行,直到佇列中無回撥函式或達到系統最大限度

--輪詢佇列為空

--如果有設定setImmediate

進入check階段,執行setImmediate所設定的回撥函式

--如果沒有設定setImmediate

在此階段停留,等待回撥函式插入到輪詢佇列中,然後執行他們

--一旦輪詢佇列為空,事件迴圈將檢查達到其時間閾值的定時器,如果一個或多個定時器準備就緒,則事件迴圈將返回到計時器階段,執行定時器的回撥

第五階段:check

--專門用於執行setImmediate所設定的回撥函式

第六階段:close callback(關閉回撥階段)

process.nextTick:可以再任意階段被優先執行

https://images2015.cnblogs.com/blog/104032/201509/104032-20150917141055570-1948801510.png

如圖:每個非同步函式執行結束後,都會在事件佇列中追加一個事件(同時儲存一些必要的引數)。事件輪詢下一次迴圈便可取出事件,然後會呼叫非同步方法對應的回撥函式(引數)。這樣一來,node便能保證開發者編寫的每行程式碼(每個回撥)均在主執行緒執行。注意:如果開發者而在回撥函式中呼叫了阻塞方法,那麼整個事件輪詢就會阻塞,事件佇列中的事件得不到及時處理。因此,node中一些方法均是非同步的。