單線程
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事件的執行狀態已完成,則執行該對象綁定的回調函數。
參考資料: http://blog.csdn.net/xiangzhihong8/article/details/53954600?locationNum=13&fps=1
<深入淺出Node.js>
新聞熱點
疑難解答