1. 程式人生 > >nodejs 單線程 高並發

nodejs 單線程 高並發

nodejs alt 新的 通過 lib 開始 con col 就是

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層的事件循環機制,和底層線程池的實現。

(有待完善。)

nodejs 單線程 高並發