首頁 >web前端 >前端問答 >node.js是單執行緒的嗎

node.js是單執行緒的嗎

WBOY
WBOY原創
2022-04-19 17:05:292867瀏覽

node.js預設是單執行緒的,因為JavaScript引擎的關係,node.js採用的是單執行緒異步非阻塞的模式,一個nodejs無法利用多核心資源;但可以有第三方函式庫提供多線程的支持,只是主線程是單線程,主線程中的操作是同步阻塞的。

node.js是單執行緒的嗎

本教學操作環境:windows10系統、nodejs 12.19.0版本、Dell G3電腦。

node.js是單線程的嗎

node.js預設是單線程,node.js採用單線程非同步非阻塞模式。

node.js採用單執行緒非同步非阻塞模式。它的單線程指的是自身Javascript運行環境的單線程,Node.js並沒有給Javascript執行時創建新線程的能力,透過Libuv以及它的事件循環來實現非同步。

Node 只是主線程是單線程,主線程中的操作是同步阻塞的。但它把所有需要非同步的操作丟給了IO線程池,主線程透過一定的事件輪詢機制與IO線程池互動得到非同步資料。

node.js的效能不是最高的,因為javascript引擎的關係,node.js預設是單線程,一個node.js應用程式無法利用多核心資源。

不過有第三方函式庫提供多執行緒支持,但不是無縫的。 node.js是解決I/O瓶頸的(相對於傳統技術,同步阻塞調用浪費線程),它並沒有提高I/O速度,只是資源調度更有效率。如果I/O速度不解決,node.js只能說能同時處理好多request,但每個request的回應時間還是那麼長,甚至更長。

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

依賴事件驅動。

node.js是單執行緒的嗎

每個Node.js進程只有一個主執行緒在執行程式碼,形成一個執行堆疊(execution context stack)。

主執行緒之外,也維護了一個"事件佇列"(Event queue)。當使用者的網路請求或其它的非同步操作到來時,node都會把它放到Event Queue之中,此時並不會立即執行它,程式碼也不會被阻塞,繼續往下走,直到主執行緒程式碼執行完畢。

主執行緒程式碼執行完畢完成後,然後透過Event Loop,也就是事件循環機制,開始到Event Queue的開頭取出第一個事件,從執行緒池中分配一個執行緒去執行這個事件,接下來繼續取出第二個事件,再從執行緒池中分配一個執行緒去執行,然後第三個,第四個。主執行緒不斷的檢查事件佇列中是否有未執行的事件,直到事件佇列中所有事件都執行完了,此後每當有新的事件加入到事件佇列中,都會通知主執行緒依序取出交EventLoop處理。當有事件執行完畢後,會通知主線程,主線程執行回調,線程歸還給線程池。

主執行緒不斷重複上面的第三步。

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

推薦學習:《nodejs影片教學

以上是node.js是單執行緒的嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn