NodeJS 真的是單線程嗎


Node 真的是單線程么

Node 只是主線程是單線程,主線程中的操作是同步阻塞的。但它把所有需要異步的操作扔給了IO線程池,主線程通過一定的事件輪詢機制與IO線程池交互得到異步數據。

Node 是單線程,那它是如何處理高並發請求的?

依靠事件驅動。

  1. 每個Node.js進程只有一個主線程在執行程序代碼,形成一個執行棧(execution context stack)。
  2. 主線程之外,還維護了一個"事件隊列"(Event queue)。當用戶的網絡請求或者其它的異步操作到來時,node都會把它放到Event Queue之中,此時並不會立即執行它,代碼也不會被阻塞,繼續往下走,直到主線程代碼執行完畢。
  3. 主線程代碼執行完畢完成后,然后通過Event Loop,也就是事件循環機制,開始到Event Queue的開頭取出第一個事件,從線程池中分配一個線程去執行這個事件,接下來繼續取出第二個事件,再從線程池中分配一個線程去執行,然后第三個,第四個。主線程不斷的檢查事件隊列中是否有未執行的事件,直到事件隊列中所有事件都執行完了,此后每當有新的事件加入到事件隊列中,都會通知主線程按順序取出交EventLoop處理。當有事件執行完畢后,會通知主線程,主線程執行回調,線程歸還給線程池。
  4. 主線程不斷重復上面的第三步。

NodeJs 單線程只是一個主線程,本質上的異步操作還是由線程池完成的,node將所有的阻塞操作都交給了內部的線程池去實現,本身只負責不斷的往返調度,並沒有進行真正的I/O操作,從而實現異步非阻塞I/O,這便是node單線程和事件驅動的精髓之處了。

主線程需要通過事件循環來處理來自線程池的已經執行完畢的異步操作的回調函數,具體參見NodeJs 的 Event loop 事件循環機制詳解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM