JavaScript是一個Synchronous(同步)執行的語言,以「一次只做一件事」的方式執行,同一時間只能執行一行程式碼。NodeJS藉由libuv
模組,使JavaScript的應用程式在執行時可以達到Asynchronous(非同步)的效果,可以在同一個時間執行不同的程式碼。今天的內容比較偏向概念說明,主要有關libuv
模組與NodeJS的非同步。
libuv是一個著重於非同步輸入/輸出(I/O)的函式庫,支援多種平台,最主要的開發目的是用於NodeJS。在libuv模組的運作方式中有兩個重要的部分:Event Loop與Queue,當libuv中的函式對電腦的作業系統提出請求(request),作業系統給予的回應事件(Events)會傳送到Queue暫存,而等候作業系統給予回應的期間,libuv會透過Event Loop持續向Queue確認是否有事件進入,當事件進入便立即存取。
在整個系列文的一開始有提到,NodeJS以V8作為執行JavaScript的引擎,是使用同步執行的機制,那NodeJS到底是怎麼達到非同步的 上面有提到libuv
模組的運作邏輯,加入V8的運作方式就可以逐步了解。
由於V8是同步的,因此程式碼在執行時需等候前面的程式碼執行,而libuv
模組經過提出請求的流程後,以Event Loop不斷確認回應事件,取得事件後再接著之後的工作,當程式碼透過V8執行時,libuv
取得事件後會觸發回呼函式(callback)以V8執行,同時libuv也持續追蹤作業系統的回應成果,使得V8在執行程式碼的同時,NodeJS仍可透過libuv
進行與作業系統端的工作,因此能讓NodeJS得以非同步執行。
NodeJS中的非同步在請求作業系統執行工作的同時,主程式的程式碼也可持續執行,可以避免在應用程式執行時,產生過多的等待時間,也能在多個程式碼需要執行的情況下,避免塞車的情況。
http://docs.libuv.org/en/v1.x/
Learn and Understand NodeJS [課程]