node真的是單執行緒模式嗎

2022-07-28 00:57:10 字數 740 閱讀 1269

提到node,我們就可以立刻想到單執行緒、非同步io、事件驅動等字眼。首先要明確的是node真的是單執行緒的嗎,如果是單執行緒的,那麼非同步io,以及定時事件(settimeout、setinterval等)又是在**被執行的。

其實,按照嚴格來說,node並不是單執行緒的。node中存在著多種執行緒,包括:

我們平時所說的單執行緒是指node中只有乙個js引擎在主線程上執行。其他非同步io和事件驅動相關的執行緒通過libuv來實現內部的執行緒池和執行緒排程。libv中存在了乙個event loop,通過event loop來切換實現類似於多執行緒的效果。簡單的來講event loop就是維持乙個執行棧和乙個事件佇列,當前執行棧中的如果發現非同步io以及定時器等函式,就會把這些非同步**函式放入到事件佇列中。當前執行棧執行完成後,從事件佇列中,按照一定的順序執行事件佇列中的非同步**函式。

上圖中從執行棧,到事件佇列,最後事件佇列中按照一定的順序執行**函式,整個過程就是乙個簡化版的event loop。此外**函式執行時,同樣會生成乙個執行棧,在**函式裡面還有可能巢狀非同步的函式,也就是說執行棧存在著巢狀。

也就是說node中的單執行緒是指js引擎只在唯一的主線程上執行,其他的非同步操作,也是有獨立的執行緒去執行,通過libv的event loop實現了類似於多執行緒的上下文切換以及執行緒池排程。執行緒是最小的程序,因此node也是單程序的。這樣就解釋了為什麼node是單執行緒和單程序的。

NodeJS真的是單執行緒嗎?

要理解這個問題,我們先思考乙個麥當勞的服務員的例子。我們去了麥當勞,向服務員點乙份薯條。這時,服務員並不是立刻把薯條給我們,只是給廚房送入你的點單。然後我們在一旁等待。這時服務員又開始接受下一位顧客的點單。同樣的,服務員並不會立刻把食物送出,他只是給廚房送入你點的單而已。5分鐘後,我們的薯條炸好了。...

NodeJS 真的是單執行緒嗎

node 只是主線程是單執行緒,主線程中的操作是同步阻塞的。但它把所有需要非同步的操作扔給了io執行緒池,主線程通過一定的事件輪詢機制與io執行緒池互動得到非同步資料。依靠事件驅動。每個node.js程序只有乙個主線程在執行程式 形成乙個執行棧 execution context stack 主線程...

Node單執行緒高併發原理

瀏覽器中的js是單執行緒的,node也是單執行緒的。這個單執行緒相當於乙個大管家,一切大小事務都要經過他的手才能辦成,它總是把io任務放入到任務池中。雖然說是單執行緒,但是node也有乙個執行緒池專門負責執行任務池中的任務,它們把任務完成之後會告知主線程以接下來利用cpu完成處理。關鍵在於理清哪些任...