淺析Js Event Loop

什麼是Event Loop?node

官網解釋異步

clipboard.png

我的理解是js的單線程是他的任務棧是單線程,但他處理異步i/o的方法是依賴libuv開啓線程池去處理,完成以後任務加到poll queue裏,而後等任務棧的任務爲空或事件到達閥值時,把poll queue和定時器的任務加到任務棧裏,繼續這個循環,這就是大致上的js的Event Loop。socket

結構ide

┌───────────────────────────┐
┌─>│           timers          │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │     pending callbacks     │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │       idle, prepare       │
│  └─────────────┬─────────────┘      ┌───────────────┐
│  ┌─────────────┴─────────────┐      │   incoming:   │
│  │           poll            │<─────┤  connections, │
│  └─────────────┬─────────────┘      │   data, etc.  │
│  ┌─────────────┴─────────────┐      └───────────────┘
│  │           check           │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
└──┤      close callbacks      │
   └───────────────────────────┘

timer:
定時任務,當到達閥值時,他不會當即執行,會等待任務棧的任務會阻塞他。oop

pending callbacks:
此階段執行某些系統操做(例如TCP錯誤類型)的回調。例如,若是TCP套接字在嘗試鏈接時收到,則某些*nix系統但願等待報告錯誤。這將排隊等待在掛起的回調階段執行。ui

pull:
這個階段有兩個主要功能:
計算它應該阻塞和輪詢I / O的時間,而後
處理輪詢隊列中的事件。
當事件循環進入輪詢階段而且沒有計劃定時器時,將發生如下兩種狀況之一:spa

若是輪詢隊列不爲空,則事件循環將遍歷其同步執行它們的回調隊列,直到隊列已用盡,或者達到系統相關的硬限制。線程

若是輪詢隊列爲空,則會發生如下兩種狀況之一:3d

若是腳本已執行setImmediate,則事件循環將結束poll階段並繼續執行check階段以執行這些調度腳本。code

若是腳本沒有執行setImmediate,事件循環將等待回調被添加到poll queue中,而後當即執行。

一旦poll queue爲空事件循環將檢查timer,若是一個或多個定時器準備就緒,事件循環將回繞到timer階段以執行那些timer的回調。

check
此階段容許人員在輪詢階段完成後當即執行回調 。若是輪詢階段變爲空閒而且存在setImmediate任務,那麼事件循環直接跳到check執行而不是阻塞在poll階段等待回調被加入。

setImmediate其實是一個特殊的計時器,它在事件循環的一個單獨階段運行。它使用libuv API來調度在輪詢階段完成後執行的回調。

close callbacks

若是socket或handle忽然關閉(例如socket.destroy()),則該 'close'事件將在此階段發出。不然它將經過發射process.nextTick()。

引用:

https://nodejs.org/en/docs/gu...
相關文章
相關標籤/搜索