iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0
自我挑戰組

學習NodeJS的30天系列 第 8

Day8 NodeJS-libuv與Asynchonous

JavaScript是一個Synchronous(同步)執行的語言,以「一次只做一件事」的方式執行,同一時間只能執行一行程式碼。NodeJS藉由libuv模組,使JavaScript的應用程式在執行時可以達到Asynchronous(非同步)的效果,可以在同一個時間執行不同的程式碼。今天的內容比較偏向概念說明,主要有關libuv模組與NodeJS的非同步。

libuv模組

libuv是一個著重於非同步輸入/輸出(I/O)的函式庫,支援多種平台,最主要的開發目的是用於NodeJS。在libuv模組的運作方式中有兩個重要的部分:Event Loop與Queue,當libuv中的函式對電腦的作業系統提出請求(request),作業系統給予的回應事件(Events)會傳送到Queue暫存,而等候作業系統給予回應的期間,libuv會透過Event Loop持續向Queue確認是否有事件進入,當事件進入便立即存取。

https://ithelp.ithome.com.tw/upload/images/20210923/20139980AtQdpreFD2.jpg

NodeJS的非同步

在整個系列文的一開始有提到,NodeJS以V8作為執行JavaScript的引擎,是使用同步執行的機制,那NodeJS到底是怎麼達到非同步的/images/emoticon/emoticon70.gif 上面有提到libuv模組的運作邏輯,加入V8的運作方式就可以逐步了解。

由於V8是同步的,因此程式碼在執行時需等候前面的程式碼執行,而libuv模組經過提出請求的流程後,以Event Loop不斷確認回應事件,取得事件後再接著之後的工作,當程式碼透過V8執行時,libuv取得事件後會觸發回呼函式(callback)以V8執行,同時libuv也持續追蹤作業系統的回應成果,使得V8在執行程式碼的同時,NodeJS仍可透過libuv進行與作業系統端的工作,因此能讓NodeJS得以非同步執行。

https://ithelp.ithome.com.tw/upload/images/20210923/20139980vOtlPCB3IW.jpg

小結

NodeJS中的非同步在請求作業系統執行工作的同時,主程式的程式碼也可持續執行,可以避免在應用程式執行時,產生過多的等待時間,也能在多個程式碼需要執行的情況下,避免塞車的情況。

參考資料

http://docs.libuv.org/en/v1.x/

Learn and Understand NodeJS [課程]


上一篇
Day7 JS-Callback
下一篇
Day9 NodeJS-Buffer與Stream
系列文
學習NodeJS的30天30

尚未有邦友留言

立即登入留言