node真的是單線程模式嗎

     提到node,咱們就能夠馬上想到單線程、異步IO、事件驅動等字眼。首先要明確的是node真的是單線程的嗎,若是是單線程的,那麼異步IO,以及定時事件(setTimeout、setInterval等)又是在哪裏被執行的。node

     其實,按照嚴格來講,node並非單線程的。node中存在着多種線程,包括:ajax

  • js引擎執行的線程
  • 定時器線程(setTimeout, setInterval)
  • 異步http線程(ajax)

     ...多線程

     咱們平時所說的單線程是指node中只有一個js引擎在主線程上運行。其餘異步IO和事件驅動相關的線程經過libuv來實現內部的線程池和線程調度。libv中存在了一個Event Loop,經過Event Loop來切換實現相似於多線程的效果。簡單的來說Event Loop就是維持一個執行棧和一個事件隊列,當前執行棧中的若是發現異步IO以及定時器等函數,就會把這些異步回調函數放入到事件隊列中。當前執行棧執行完成後,從事件隊列中,按照必定的順序執行事件隊列中的異步回調函數。異步

 

 

      上圖中從執行棧,到事件隊列,最後事件隊列中按照必定的順序執行回調函數,整個過程就是一個簡化版的Event Loop。此外回調函數執行時,一樣會生成一個執行棧,在回調函數裏面還有可能嵌套異步的函數,也就是說執行棧存在着嵌套。函數

      也就是說node中的單線程是指js引擎只在惟一的主線程上運行,其餘的異步操做,也是有獨立的線程去執行,經過libv的Event Loop實現了相似於多線程的上下文切換以及線程池調度。線程是最小的進程,所以node也是單進程的。這樣就解釋了爲何node是單線程和單進程的。oop

相關文章
相關標籤/搜索