node的環境下的事件輪詢機制
阿新 • • 發佈:2020-10-13
事件輪詢
維持主執行緒執行的迴圈就是事件輪詢,存在於主執行緒中,負責不停的呼叫開發者編寫的程式碼
第一階段:timers(定時器階段)
--此階段由setTimeout()和安排的回撥setInterval()
--輪詢階段控制定時器的執行時間
第二階段:pending callbacks (系統階段)
--執行推遲到下一個階段迭代的I/O回撥
第三階段:idle,prepare(準備階段)
第四階段:poll(輪詢階段,核心)
--輪詢佇列不為空,佇列中有回撥函式
從佇列中取出回撥函式,同步執行,直到佇列中無回撥函式或達到系統最大限度
--輪詢佇列為空
--如果有設定setImmediate
進入check階段,執行setImmediate所設定的回撥函式
--如果沒有設定setImmediate
在此階段停留,等待回撥函式插入到輪詢佇列中,然後執行他們
--一旦輪詢佇列為空,事件迴圈將檢查達到其時間閾值的定時器,如果一個或多個定時器準備就緒,則事件迴圈將返回到計時器階段,執行定時器的回撥
第五階段:check
--專門用於執行setImmediate所設定的回撥函式
第六階段:close callback(關閉回撥階段)
process.nextTick:可以再任意階段被優先執行
如圖:每個非同步函式執行結束後,都會在事件佇列中追加一個事件(同時儲存一些必要的引數)。事件輪詢下一次迴圈便可取出事件,然後會呼叫非同步方法對應的回撥函式(引數)。這樣一來,node便能保證開發者編寫的每行程式碼(每個回撥)均在主執行緒執行。注意:如果開發者而在回撥函式中呼叫了阻塞方法,那麼整個事件輪詢就會阻塞,事件佇列中的事件得不到及時處理。因此,node中一些方法均是非同步的。