本篇文章給大家了解一下Nodejs中的事件循環,解析下事件循環機制、process.nextTick()等,希望對大家有所幫助!
什么是事件循環
事件循環是 Node.js 處理非阻塞 I/O 操作的機制——盡管 JavaScript 是單線程處理的——當有可能的時候,它們會把操作轉移到系統內核中去。
既然目前大多數內核都是多線程的,它們可在后臺處理多種操作。當其中的一個操作完成的時候,內核通知 Node.js 將適合的回調函數添加到輪詢隊列中等待時機執行。我們在本文后面會進行詳細介紹。
事件循環機制解析
當 Node.js 啟動后,它會初始化事件循環,處理已提供的輸入腳本(或丟入 REPL,本文不涉及到),它可能會調用一些異步的 API、調度定時器,或者調用 process.nextTick()
,然后開始處理事件循環。
下面的圖表展示了事件循環操作順序的簡化概覽。
┌───────────────────────────┐ ┌─>│ timers │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ pending callbacks │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ idle, prepare │ │ └─────────────┬─────────────┘ ┌───────────────┐ │ ┌─────────────┴─────────────┐ │ incoming: │ │ │ poll │<─────┤ connections, │ │ └─────────────┬─────────────┘ │ data, etc. │ │ ┌─────────────┴─────────────┐ └───────────────┘ │ │ check │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ └──┤ close callbacks │ └───────────────────────────┘
注意:每個框被稱為事件循環機制的一個階段。
每個階段都有一個 FIFO 隊列來執行回調。雖然每個階段都是特殊的,但通常情況下,當事件循環進入給定的階段時,它將執行特定于該階段的任何操作,然后執行該階段隊列中的回調,直到隊列用盡或最大回調數已執行。當該隊列已用盡或達到回調限制,事件循環將移動到下一階段,等等。
由于這些操作中的任何一個都可能調度_