node 只是主線程是單執行緒,主線程中的操作是同步阻塞的。但它把所有需要非同步的操作扔給了io執行緒池,主線程通過一定的事件輪詢機制與io執行緒池互動得到非同步資料。
依靠事件驅動。
每個node.js程序只有乙個主線程在執行程式**,形成乙個執行棧(execution context stack)。
主線程之外,還維護了乙個"事件佇列"(event queue)。當使用者的網路請求或者其它的非同步操作到來時,node都會把它放到event queue之中,此時並不會立即執行它,**也不會被阻塞,繼續往下走,直到主線程**執行完畢。
主線程**執行完畢完成後,然後通過event loop,也就是事件迴圈機制,開始到event queue的開頭取出第乙個事件,從執行緒池中分配乙個執行緒去執行這個事件,接下來繼續取出第二個事件,再從執行緒池中分配乙個執行緒去執行,然後第三個,第四個。主線程不斷的檢查事件佇列中是否有未執行的事件,直到事件佇列中所有事件都執行完了,此後每當有新的事件加入到事件佇列中,都會通知主線程按順序取出交eventloop處理。當有事件執行完畢後,會通知主線程,主線程執行**,執行緒歸還給執行緒池。
主線程不斷重複上面的第三步。
nodejs 單執行緒只是乙個主線程,本質上的非同步操作還是由執行緒池完成的,node將所有的阻塞操作都交給了內部的執行緒池去實現,本身只負責不斷的往返排程,並沒有進行真正的i/o操作,從而實現非同步非阻塞i/o,這便是node單執行緒和事件驅動的精髓之處了。
主線程需要通過事件迴圈來處理來自執行緒池的已經執行完畢的非同步操作的**函式,具體參見nodejs 的 event loop 事件迴圈機制詳解
NodeJS真的是單執行緒嗎?
要理解這個問題,我們先思考乙個麥當勞的服務員的例子。我們去了麥當勞,向服務員點乙份薯條。這時,服務員並不是立刻把薯條給我們,只是給廚房送入你的點單。然後我們在一旁等待。這時服務員又開始接受下一位顧客的點單。同樣的,服務員並不會立刻把食物送出,他只是給廚房送入你點的單而已。5分鐘後,我們的薯條炸好了。...
node真的是單執行緒模式嗎
提到node,我們就可以立刻想到單執行緒 非同步io 事件驅動等字眼。首先要明確的是node真的是單執行緒的嗎,如果是單執行緒的,那麼非同步io,以及定時事件 settimeout setinterval等 又是在 被執行的。其實,按照嚴格來說,node並不是單執行緒的。node中存在著多種執行緒,...
nodejs 單執行緒 高併發
nodejs為什麼是單執行緒且支援高併發的指令碼語言呢?1.node的優點 i o密集型處理 node的i o請求都是非同步的,如 sql查詢 檔案流操作 http請求 非同步i o?顧名思義就是非同步的發出i o請求 要理解node的原理,可能還需要了解一些多執行緒或者併發的基本知識。nodejs...