千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > 在節(jié)點(diǎn)中進(jìn)行多任務(wù)處理.js使用群集模塊

在節(jié)點(diǎn)中進(jìn)行多任務(wù)處理.js使用群集模塊

來源:千鋒教育
發(fā)布人:syq
時(shí)間: 2022-09-22 15:36:29 1663832189

  我們已經(jīng)知道Node.js是單線程的,這意味著它將在可能具有多個(gè)內(nèi)核的系統(tǒng)中使用處理器的單個(gè)內(nèi)核。盡管它可以很好地處理單線程系統(tǒng)的負(fù)載,但肯定有優(yōu)化的空間,集群模塊是這樣做的一種方式。

在節(jié)點(diǎn)中進(jìn)行多任務(wù)處理

  引入群集模塊是為了通過在多個(gè)處理器內(nèi)核上運(yùn)行工作進(jìn)程/子進(jìn)程來擴(kuò)展應(yīng)用程序執(zhí)行。這些進(jìn)程共享相同的服務(wù)器端口,但即使使用相同的端口,這些進(jìn)程在一天結(jié)束時(shí)也是獨(dú)立的進(jìn)程。因此,他們每個(gè)人都有自己的 V8 實(shí)例、事件循環(huán)、自己的內(nèi)存以及所有爵士樂。這些進(jìn)程使用 IPC(進(jìn)程間通信)通道與父進(jìn)程進(jìn)行通信。在學(xué)習(xí)本教程的過程中,我們將查看所有功能,因此讓我們深入研究一下。

  我們?cè)噲D解決的問題

  讓我們通過鍵入 來快速設(shè)置節(jié)點(diǎn)項(xiàng)目。(為了方便起見,我將添加快遞,但你不一定非要這樣做)。通過鍵入 來安裝快速和負(fù)載測(cè)試。我們將在本教程的后面部分使用 loadtest 來了解使用群集模塊獲得的性能優(yōu)勢(shì)。安裝后,創(chuàng)建一個(gè)名為 nonCluster 的文件.js并復(fù)制此代碼(此文件將包含不帶群集模塊的代碼,以便進(jìn)行比較)。npm init -ynpm i express loadtest

21

  這是一個(gè)非常簡(jiǎn)單的快速應(yīng)用程序,有2個(gè)請(qǐng)求。終結(jié)點(diǎn)執(zhí)行 CPU 密集型任務(wù),從而阻止事件循環(huán)。終結(jié)點(diǎn)會(huì)立即返回響應(yīng)。簡(jiǎn)單!/heavy/light

  現(xiàn)在運(yùn)行服務(wù)器,先向終結(jié)點(diǎn)發(fā)出請(qǐng)求,然后再向終結(jié)點(diǎn)發(fā)出請(qǐng)求。終端節(jié)點(diǎn)顯然需要時(shí)間,但您會(huì)注意到終端節(jié)點(diǎn)也花費(fèi)了相同的時(shí)間。這是因?yàn)槎它c(diǎn)占用了計(jì)算請(qǐng)求的時(shí)間,因此阻塞了事件循環(huán)。因此,在請(qǐng)求之后發(fā)出的任何請(qǐng)求現(xiàn)在都必須等待其完成。/heavy/light/heavy/light/heavy/heavy

  問題的解決方案

  因此,為了避免這種阻塞,讓我們添加集群模塊。在名為 cluster.js的新文件中,復(fù)制以下代碼:

22

  讓我們來分解一下。最初,當(dāng)您有一個(gè)進(jìn)程時(shí),它會(huì)解析所有傳入的請(qǐng)求。現(xiàn)在我們使用的是群集模塊,將有 2 種類型的進(jìn)程。父/主進(jìn)程和子進(jìn)程。最初,當(dāng)服務(wù)器啟動(dòng)時(shí),它將啟動(dòng)一組進(jìn)程。之后,每當(dāng)有人向服務(wù)器發(fā)出請(qǐng)求時(shí),父進(jìn)程就會(huì)將請(qǐng)求定向到子進(jìn)程(主要以輪循機(jī)制方式)。然后,子進(jìn)程將最終解決該請(qǐng)求。

23

  在塊內(nèi),我們將檢查當(dāng)前進(jìn)程是否是父進(jìn)程。群集模塊具有一個(gè)名為 的屬性,該屬性允許您知道當(dāng)前進(jìn)程是子進(jìn)程還是父進(jìn)程。如果是父進(jìn)程,則使用 fork 方法創(chuàng)建群集。(我們只啟動(dòng)與系統(tǒng)中存在的內(nèi)核總數(shù)相等的進(jìn)程,以避免調(diào)度開銷。

  如果它不是父進(jìn)程,則意味著它是一個(gè)子進(jìn)程。因此,這個(gè)子進(jìn)程現(xiàn)在實(shí)際上負(fù)責(zé)解析請(qǐng)求。它將具有所有API端點(diǎn)及其相應(yīng)的邏輯。ifisMaster

24

  分叉新工作線程后,它將以事件進(jìn)行響應(yīng)。我們將在父級(jí)上偵聽此事件,以查看是否按預(yù)期創(chuàng)建了所有進(jìn)程。online

  當(dāng)工作線程死亡時(shí),群集模塊會(huì)發(fā)出一個(gè)事件。因此,為了不使我們的應(yīng)用程序停機(jī),我們將在新進(jìn)程出現(xiàn)故障時(shí)分叉。這樣,我們將始終啟動(dòng)并運(yùn)行一組進(jìn)程,即使任何其他進(jìn)程因任何有意或無意的原因而關(guān)閉。exit

  好吧,這看起來不錯(cuò)。現(xiàn)在,如果運(yùn)行此文件并發(fā)出相同的請(qǐng)求(首先向終結(jié)點(diǎn)發(fā)出請(qǐng)求,然后向終結(jié)點(diǎn)發(fā)出請(qǐng)求),則會(huì)看到它按預(yù)期工作,而不會(huì)阻塞事件循環(huán)。因此,添加一組進(jìn)程確實(shí)有幫助。現(xiàn)在,讓我們使用負(fù)載測(cè)試包來執(zhí)行一些相對(duì)繁重的測(cè)試。/heavy/light

  由于群集應(yīng)用程序已在運(yùn)行,因此讓我們先對(duì)其進(jìn)行測(cè)試。鍵入以運(yùn)行測(cè)試。(如果您沒有全局安裝負(fù)載測(cè)試,只需在命令開頭添加 npx 即可。loadtest -n 1000 -c 100

  -n 表示我設(shè)置為 1000 的請(qǐng)求總數(shù)。

  -c 代表并發(fā)。它基本上將模擬一個(gè)真實(shí)世界的環(huán)境,其中應(yīng)用程序同時(shí)從多個(gè)客戶端接收請(qǐng)求,在這種情況下,它將是100個(gè)同時(shí)客戶端。

  這些是“群集”應(yīng)用程序的匯總結(jié)果。

25

  現(xiàn)在,讓我們切換到“非群集”應(yīng)用程序,并再次運(yùn)行相同的測(cè)試。

26

  使用群集時(shí),整體性能明顯有顯著提高。但有一個(gè)問題。這兩項(xiàng)測(cè)試都是針對(duì)端點(diǎn)的,這是一個(gè) CPU 密集型操作。讓我們嘗試運(yùn)行相同的測(cè)試,但這次是針對(duì)終結(jié)點(diǎn)。/heavy/light

27

  驚喜,驚喜。在此示例中,使用群集時(shí),我們的性能實(shí)際上相對(duì)較差。為什么?

  你看,Node.js主要是為I/O操作設(shè)計(jì)的,在大多數(shù)情況下,它不會(huì)阻塞事件循環(huán)。因此,由于它知道如何處理這些類型的操作,因此添加額外的進(jìn)程并將請(qǐng)求路由到這些進(jìn)程中的每一個(gè)最終都是很可能不需要的開銷。但是,在 CPU 密集型阻塞操作的情況下,最好在確實(shí)需要群集的進(jìn)程之間拆分請(qǐng)求數(shù)。

  因此,它最終歸結(jié)為您的應(yīng)用程序的設(shè)計(jì)目的。如果你有一個(gè)微服務(wù)架構(gòu),并且有一個(gè)特定的服務(wù)來處理 CPU 密集型操作,你可以為該特定服務(wù)啟動(dòng)一個(gè)集群,其余的可以由你的單線程節(jié)點(diǎn)進(jìn)程處理。

  所以,這就是你在 Node.js應(yīng)用程序中使用集群的方式。它有自己的一組警告,在將其添加到代碼庫(kù)之前,您需要了解它們。

tags:
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
深度學(xué)習(xí)模型權(quán)重h5、weights、ckpt、pth有什么區(qū)別?

1.來源框架不同h5格式通常用于Keras和TensorFlow框架,weights用于Darknet框架,ckpt是TensorFlow框架的一種格式,而pth則主要用于PyTorch框架...詳情>>

2023-10-15 00:05:17
大數(shù)據(jù)測(cè)試工程師需要具備哪些技能?

一、理解大數(shù)據(jù)概念大數(shù)據(jù)測(cè)試工程師需要理解大數(shù)據(jù)的基本概念和原理,如分布式存儲(chǔ)、MapReduce、實(shí)時(shí)計(jì)算等。他們還需要了解如何處理大規(guī)模的...詳情>>

2023-10-14 23:43:03
為什么SpringBoot的 jar 可以直接運(yùn)行?

一、JAR文件的結(jié)構(gòu)與執(zhí)行方式Spring Boot的JAR包是Java Archive的縮寫,它是一種壓縮文件格式,可以將Java項(xiàng)目的類文件、資源文件以及依賴庫(kù)等...詳情>>

2023-10-14 23:01:49
站群服務(wù)器是什么?

站群服務(wù)器的含義與用途站群服務(wù)器主要用于支持站群,即由一組相互鏈接的網(wǎng)站組成的群體。這些網(wǎng)站通常由同一組織或個(gè)人擁有,并且經(jīng)常會(huì)互相鏈...詳情>>

2023-10-14 22:46:12
自編碼器是什么?

一、自編碼器原理自編碼器的設(shè)計(jì)靈感源于神經(jīng)科學(xué)中關(guān)于感知系統(tǒng)的認(rèn)知原理,它的核心思想是將輸入數(shù)據(jù)經(jīng)過編碼過程,形成一個(gè)隱藏層的特征表示...詳情>>

2023-10-14 22:41:10
快速通道
久久亚洲中文字幕精品一区四,亚洲日本另类欧美一区二区,久久久久久久这里只有免费费精品,高清国产激情视频在线观看
色男人在线视频免费观看 | 日韩一级a毛大片在线电影 色七七在线免费观看视频 在线观看黄AⅤ免费观看 | 亚洲欧美高清在线精品二区 | 在线播放一区二区不卡三区 | 亚洲人成综合网一区二区三区 | 三个少妇的按摩中文字幕 |