這篇文章帶給大家的內容是關於JavaScript中Event Loop的分析,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
什麼是Event Loop?
官網解釋
個人理解是js的單線程是他的任務堆疊是單線程,但他處理非同步i/o的方法是依賴libuv開啟線程池去處理,完成之後任務加到poll queue裡,然後等任務棧的任務為空或事件到達閥值時,把poll queue和定時器的任務加到任務棧裡,繼續這個循環,這就是大體上的js的Event Loop。
結構
┌───────────────────────────┐ ┌─>│ timers │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ pending callbacks │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ idle, prepare │ │ └─────────────┬─────────────┘ ┌───────────────┐ │ ┌─────────────┴─────────────┐ │ incoming: │ │ │ poll │<p><strong>timer:</strong><br> 定時任務,當到達閥值時,他不會立即執行,會等待任務堆疊的任務會阻塞他。 </p><p><strong>pending callbacks:</strong><br> 此階段執行某些系統動作(例如TCP錯誤類型)的回呼。例如,如果TCP套接字在嘗試連線時收到,則某些*nix系統希望等待報告錯誤。這將排隊等待在掛起的回調階段執行。 </p><p><strong>pull:</strong> <br>這個階段有兩個主要功能:<br> 計算它應該阻塞和輪詢I / O的時間,然後<br> 處理輪詢佇列中的事件。 <br>當事件循環進入輪詢階段且沒有計劃計時器時,將發生以下兩種情況之一:</p><p>如果輪詢佇列不為空,則事件循環將遍歷其同步執行它們的回呼隊列,直到隊列已用盡,或達到系統相關的硬限制。 </p><p>如果輪詢隊列為空,則會發生以下兩種情況之一:</p><p>如果腳本已執行setImmediate,則事件循環將結束poll階段並繼續執行check階段以執行這些調度腳本。 </p><p>如果腳本沒有執行setImmediate,則事件循環將等待回呼被加入到poll queue中,然後立即執行。 </p><p>一旦poll queue為空事件循環將檢查timer,如果一個或多個定時器準備就緒,事件循環將迴繞到timer階段以執行那些timer的回調。 </p><p><strong>check</strong> <br>此階段允許人員在輪詢階段完成後立即執行回呼 。如果輪詢階段變成空閒並且存在setImmediate任務,那麼事件循環就會直接跳到check執行而不是阻塞在poll階段等待回呼被加入。 </p><p>setImmediate實際上是一個特殊的計時器,它在事件循環的一個單獨階段運行。它使用libuv API來調度在輪詢階段完成後執行的回調。 </p><p><strong>close callbacks</strong></p><p>如果socket或handle突然關閉(例如socket.destroy()),則該 'close'事件將在此階段發出。否則它將通過發射process.nextTick()。 </p><p>這篇文章到這裡就已經全部結束了,更多其他精彩內容可以關注PHP中文網的<a href="http://www.php.cn/course/list/17.html" target="_blank">JavaScript影片教學</a>專欄! </p><p><br></p><p> </p>
以上是JavaScript中Event Loop的分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!