• 單執行緒

    Node.js本身是多執行緒的,只是在解釋我們編寫的javascript程式碼時是由一個執行緒完成的,而底層是採用了多執行緒的方式來處理各種I/O操作的。

  • 事件迴圈

    在Node.js啟動動時, 會建立一個類似於while(true)的迴圈,每執行一次迴圈體的過程稱為Tick,這個一直迴圈遍歷待處理事件的機制叫做事件迴圈機制。我的個人理解是遍歷內建的所有觀察者的例項物件。

  • 非同步I/O

    Node.js執行非同步I/O操作示意圖:

    1:當執行IO操作時,Node.js底層會先建立觀察者物件
    2:然後將觀察者物件加入到事件佇列中
    3:成功後會立即返回,這樣就不會影響到JavaScript執行緒的後續執行,就達到了非同步IO的目的。
    4-5-6由Node底層實現:當底層執行緒池獲取到有需要處理的I/O操作,便分配執行緒執行該操作,當執行完後釋放該執行緒,把該事件加入到已完成的I/O佇列中等待處理,這只是為了方便理解畫的示意圖。實際過程是:當主執行緒(我們編寫的Node.js程式碼)有I/O操作時Node.js底層首先建立對應的觀察者物件(檔案、網路等請求)①,然後主執行緒直接返回繼續執行後續的程式碼。同時Node.js遍歷所有的觀察者物件,並判斷是否需要進行I/O操作,如果有則分配執行緒進行I/O處理,處理完成後歸還執行緒,並設定觀察者的I/O操作執行狀態。當Node.js底層再次遍歷觀察者時,發現該物件的I/O操作執行狀態已完成,則通知主執行緒執行響應的回撥函式。②

    個人對①和②的理解為:Node.js底層在每個Tick過程中,取出的觀察者,判斷如果有待處理的I/O事件,則為其分配執行緒進行I/O處理,處理完後修改該觀察者的執行狀態;如果I/O事件的執行狀態已完成,則執行該物件繫結的回撥函式。

<深入淺出Node.js>

.