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 來達到多執行緒設計