溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Node.js是不是單線程嗎

發(fā)布時(shí)間:2021-08-03 09:41:02 來源:億速云 閱讀:176 作者:小新 欄目:web開發(fā)

這篇文章主要為大家展示了“Node.js是不是單線程嗎”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Node.js是不是單線程嗎”這篇文章吧。

進(jìn)程

在操作系統(tǒng)中,對(duì)進(jìn)程的解釋:進(jìn)程是一個(gè)具有一定獨(dú)立功能的程序在一個(gè)數(shù)據(jù)集上的一次動(dòng)態(tài)執(zhí)行的過程,是操作系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位,是應(yīng)用程序運(yùn)行的載體。

  • 是應(yīng)用程序的一次運(yùn)行過程(動(dòng)態(tài)概念)

  • 是系統(tǒng)分配和調(diào)度資源的基本單位(進(jìn)程是一般由程序、數(shù)據(jù)集合和進(jìn)程控制塊三部分組成)

  • 每個(gè)進(jìn)程有自己獨(dú)立的空間地址,數(shù)據(jù)棧(各進(jìn)程間數(shù)據(jù)不共享,可通過其他方式進(jìn)行通信)進(jìn)程一般有初始態(tài),執(zhí)行態(tài),等待狀態(tài),就緒狀態(tài),終止?fàn)顟B(tài)五種狀態(tài)

線程

線程是程序執(zhí)行中一個(gè)單一的順序控制流程,是程序執(zhí)行流的最小單元,是處理器調(diào)度和分派的基本單位。

  • 任務(wù)調(diào)度和執(zhí)行的最小單位

  • 一個(gè)進(jìn)程中代碼單一執(zhí)行路線

進(jìn)程和線程區(qū)別

線程是程序執(zhí)行的最小單位,進(jìn)程是操作系統(tǒng)分配資源的最小單位一個(gè)進(jìn)程由一個(gè)或多個(gè)線程組成,線程是一個(gè)進(jìn)程中代碼的不同執(zhí)行路線進(jìn)程間相互獨(dú)立,但同一進(jìn)程下各線程之間共享程序的內(nèi)存空間線程上下文切換比進(jìn)程上下文切換要快

node中進(jìn)程

node是單線程的,即一個(gè)進(jìn)程只開一個(gè)線程node?!就扑]學(xué)習(xí):《nodejs 教程》】

真的單線程嗎?

Node  雖然是單線程,但是其底層是多線程的。事件循環(huán)中,libuv庫(kù)從事件隊(duì)列中取出任務(wù)再分配給不同的線程進(jìn)行處理?,F(xiàn)在硬件條件沒有以前那么落后,如果只使用單線程進(jìn)行操作,則會(huì)浪費(fèi)資源。所以,為了實(shí)現(xiàn)多進(jìn)程處理,充分發(fā)揮多核CPU的優(yōu)勢(shì),Node中提供了child_process模塊和cluster模塊。

  • child_process模塊用于開啟多個(gè)子進(jìn)程,子進(jìn)程中運(yùn)行不同的命令或執(zhí)行node.js模塊文件、可執(zhí)行文件

  • Cluster模塊,集群模塊,用于實(shí)現(xiàn)在Node.js應(yīng)用程序中開啟多個(gè)子進(jìn)程,每個(gè)子進(jìn)程中運(yùn)行一個(gè)Node.js應(yīng)用程序副本的處理

child_process模塊

  • child_process.spawn():適用于返回大量數(shù)據(jù),例如圖像處理,二進(jìn)制數(shù)據(jù)處理。

  • child_process.exec():適用于小量數(shù)據(jù),maxBuffer 默認(rèn)值為 200 * 1024 超出這個(gè)默認(rèn)值將會(huì)導(dǎo)致程序崩潰,數(shù)據(jù)量過大可采用 spawn。

  • child_process.execFile():類似 child_process.exec(),區(qū)別是不能通過 shell 來執(zhí)行,不支持像 I/O 重定向和文件查找這樣的行為

  • child_process.fork(): 衍生新的進(jìn)程,進(jìn)程之間是相互獨(dú)立的,每個(gè)進(jìn)程都有自己的 V8 實(shí)例、內(nèi)存,系統(tǒng)資源是有限的,不建議衍生太多的子進(jìn)程出來,通常根據(jù)系統(tǒng)* CPU 核心數(shù)設(shè)置。

cluster模塊

  • cluster.fork([env]) 開啟子進(jìn)程,子進(jìn)程中創(chuàng)建一個(gè)Node.js應(yīng)用程序的實(shí)例

  • isMaster屬性和isWorker屬性用于判斷是運(yùn)行在主進(jìn)程中,還是運(yùn)行在子進(jìn)程中

  • Workers屬性用于獲取所有子進(jìn)程中運(yùn)行的worker對(duì)象

擴(kuò)展一下,多線程之間如何通信?

進(jìn)程間的通信

四種:

  • 消息傳遞(管道、FIFO、消息隊(duì)列)

  • 信號(hào)量(互斥量、條件變量、讀寫鎖)

  • 共享內(nèi)存(匿名、命名)

  • 遠(yuǎn)程過程調(diào)用

進(jìn)程間的通信不僅在node中會(huì)遇到,其實(shí)在其他語言都會(huì)遇到的,當(dāng)然在面試中也是必提問的問題吧。

以上是“Node.js是不是單線程嗎”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI