nodejs是否是多執行緒

WBOY
發布: 2022-06-29 10:27:46
原創
3693 人瀏覽過

nodejs不是多線程的,而是單線程的;nodejs採用的是單線程異步非阻塞模式,因為JavaScript引擎的關係,node預設的是單線程,一個nodejs應用程式無法利用多核心資源,能夠採用事件驅動和非同步「I/O」的方式,實作一個單執行緒、高並發的執行環境。

nodejs是否是多執行緒

本文操作環境:Windows10系統、nodejs 12.19.0版、Dell G3電腦。

nodejs是否是多執行緒

node是單執行緒的,採用單執行緒異步非阻塞模式。

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

Node.js採用事件驅動和非同步I/O的方式,實作了一個單執行緒、高並發的運行時環境,而單執行緒就意味著同一時間只能做一件事。

nodejs實作非同步、非區塊:

nodejs其實只有js執行是單執行緒的,I/O顯然是其他執行緒。

js執行緒是單執行緒的,只要將所需的I/O傳遞給libuv,自己馬上回來做別的事情,然後libuv在指定的時間回調即可。

詳細而言,nodejs首先從js程式碼中在node-bindings中呼叫到C/C程式碼中,然後在C/C程式碼中封裝稱為「請求物件」的內容並傳遞給libuv。此請求物件中的一些類似於需要執行的功能回調,只需對libuv執行回調,並在執行完畢後實現回調即可。

總之,非同步I/O的大致流程如下。

1、啟動I/O呼叫

使用者從Javascript程式碼中呼叫Node核心模組,並將參數和回呼函數傳遞給核心模組

Node核心模組將傳遞的參數和回呼函數封裝在請求物件中。

將此請求物件推送至I/O執行緒池以等待執行;

Javascript非同步呼叫結束,Javascript執行緒繼續執行後續操作。

2、執行回呼

I/O作業完成後,將擷取先前封裝在請求物件中的回呼函數,並執行該函數以實現Javascript回呼的目的。 (此處回呼的詳細情況在以下說明)

從這裡可以看出,我們其實一直對Node.js的單線程有所誤解。

實際上,單線程是指Javascript執行環境中的單線程,Node.js沒有在執行Javascript時創建新線程的能力。最終的實際操作仍然在Libuv及其事件循環中執行。這就是為什麼Javascript單執行緒語言可以在Node.js中實現非同步操作的原因。兩者不會衝突。

擴充知識:

Node.js多執行緒概述

#有人可能會說,Node.js雖然是單執行緒的,但可以利用循環事件(Event Loop)l來實作並發執行任務。追究其本質,NodeJs實際上使用了兩種不同的線程,一個是用於處理循環事件的主線程一個是工作池(Worker pool)裡面的一些輔助線程。關於這兩個線程主要功能和關係如圖

nodejs是否是多執行緒

#推薦學習:《nodejs影片教學

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

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!