nodejs為什麼是單執行緒且支援高併發的指令碼語言呢?
1.node的優點:I/O密集型處理(node的I/O請求都是非同步的,如:sql查詢、檔案流操作、http請求……);非同步I/O?
顧名思義就是非同步的發出I/O請求
2.node的缺點:不擅長cpu密集型的操作(因為nodejs是單執行緒的)。
即複雜的運算、圖片的操作等。
要理解node的原理,可能還需要了解一些多執行緒或者併發的基本知識。
nodejs的單執行緒指的是主執行緒是“單執行緒”,由主執行緒去按照編碼順序一步步執行程式程式碼,假如遇到同步程式碼阻塞,主執行緒被佔用,後續的程式程式碼就會被卡主。
nodejs的單執行緒只是一個js主執行緒,本質上的一步操作還是由執行緒池完成的。node將所有的阻塞操作都交給了內部的執行緒池去實現,本身只負責不斷的往返排程,並沒有進行真正的I/O操作,從而實現非同步非阻塞I/O。
- 1、每個Node.js程式只有一個主執行緒在執行程式程式碼,形成一個執行棧(execution context stack)。
- 2、主執行緒之外,還維護了一個"事件佇列"(Event queue)。當使用者的網路請求或者其它的非同步操作到來時,node都會把它放到Event Queue之中,此時並不會立即執行它,程式碼也不會被阻塞,繼續往下走,直到主執行緒程式碼執行完畢。
- 3、主執行緒程式碼執行完畢完成後,然後通過Event Loop,也就是事件迴圈機制,開始到Event Queue的開頭取出第一個事件,從執行緒池中分配一個執行緒去執行這個事件,接下來繼續取出第二個事件,再從執行緒池中分配一個執行緒去執行,然後第三個,第四個。主執行緒不斷的檢查事件佇列中是否有未執行的事件,直到事件佇列中所有事件都執行完了,此後每當有新的事件加入到事件佇列中,都會通知主執行緒按順序取出交EventLoop處理。當有事件執行完畢後,會通知主執行緒,主執行緒執行回撥,執行緒歸還給執行緒池。
- 4、主執行緒不斷重複上面的第三步。
nodejs之所以單執行緒可以處理高併發的原因,在於libuv層的事件迴圈機制,和底層執行緒池的實現。
(有待完善。)