nodejs中的EventLoop

   ┌───────────────────────┐
┌─>│        timers         │<————— 執行 setTimeout()、setInterval() 的回調
│  └──────────┬────────────┘
|             |<-- 執行所有 Next Tick Queue 以及 MicroTask Queue 的回調
│  ┌──────────┴────────────┐
│  │     pending callbacks │<————— 執行由上一個 Tick 延遲下來的 I/O 回調(待完善,可忽略)
│  └──────────┬────────────┘
|             |<-- 執行所有 Next Tick Queue 以及 MicroTask Queue 的回調
│  ┌──────────┴────────────┐
│  │     idle, prepare     │<————— 內部調用(可忽略)
│  └──────────┬────────────┘     
|             |<-- 執行所有 Next Tick Queue 以及 MicroTask Queue 的回調
|             |                   ┌───────────────┐
│  ┌──────────┴────────────┐      │   incoming:- (執行幾乎所有的回調,除了 close callbacks 以及 timers 調度的回調和 setImmediate() 調度的回調,在恰當的時機將會阻塞在此階段)
│  │         poll          │<─────┤  connections, │ 
│  └──────────┬────────────┘      │   data, etc.  │ 
│             |                   |               | 
|             |                   └───────────────┘
|             |<-- 執行所有 Next Tick Queue 以及 MicroTask Queue 的回調
|  ┌──────────┴────────────┐      
│  │        check          │<————— setImmediate() 的回調將會在這個階段執行
│  └──────────┬────────────┘
|             |<-- 執行所有 Next Tick Queue 以及 MicroTask Queue 的回調
│  ┌──────────┴────────────┐
└──┤    close callbacks    │<————— socket.on('close', ...)
   └───────────────────────┘

先執行所有類型爲 timers 的 MacroTask,然後執行所有的 MicroTask(注意 NextTick 要優先哦);
進入 poll 階段,執行幾乎所有 MacroTask,然後執行所有的 MicroTask;
再執行所有類型爲 check 的 MacroTask,然後執行所有的 MicroTask;
再執行所有類型爲 close callbacks 的 MacroTask,然後執行所有的 MicroTask;
至此,完成一個 Tick,回到 timers 階段;
……
如此反覆,無窮無盡……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章