Event Loop 是 Javascript 主線程循環處理任務列隊(task queue)事件的運行機制

Web Event Loop

單線程設計

Javascript 主線程是以單線程的方式設計

在主線程中,包含許多要執行的任務,可以分成同步(synchronous)及非同步(asynchronous)任務,會按照順序處理這些任務

同步的任務比較單純,會遵照上方的規則,在主線程一個一個接續處理

在處理非同步任務時,不會等待非同步結果,就會接續處理後面的任務

例如,我們執行非同步任務,完成發出 ajax (不會等返回結果).., 就會接續處理後面的行程

任務列隊(task queue)與 Event Loop

Javascript 會優先處理主線程的項目,接著才會處理任務列隊(task queue)的項目

並且,讀取任務列隊的行為會不斷的重複,及稱之為 Event Loop

當我們一開始執行非同步任務,或者在後續才觸發的任務,都會被排入任務列隊中

主線程就會不斷地去檢查,並依順序處理這些任務列隊中的項目

Node.js Event Loop

Node.js 由javascript建構,也是單線程的設計

圖 by @BusyRich

  • Node.js 運作流程,會先從 V8 引擎解析應用程式的 javascript 腳本
  • 接著,會調用 Node.js Bindings (Node.js API)
  • 再透過 Libuv libary 執行 Node.js API,將這些任務以非同步方式傳給任務所屬的處理線程,並且持續執行,形成Event Loop
  • 這些非同步任務取得結果後,會將結果返回給 V8 引擎
  • V8再將這些結果傳到客戶端

Node.js 提供了兩個方法 process.nextTick, setImmediate

process.nextTick 可以在主執行線結束之前被執行 (進入下一個Event Loop之前)

setImmediate 可以在目前的任務列隊結束之前被執行

另外,node js 可以透過 Cluster API 來達到多執行緒設計

推薦閱讀 http://www.ruanyifeng.com/blog/2014/10/event-loop.html