国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) web前端 js教程 叢集和工作線程 - Node JS

叢集和工作線程 - Node JS

Nov 26, 2024 am 12:22 AM

Clustering and Worker Threads - Node JS

在上一篇文章「Node JS 內(nèi)部結(jié)構(gòu)」中,我們討論了Node JS 內(nèi)部架構(gòu),並討論了為什麼我們應(yīng)該增加節(jié)點(diǎn)線程池大小以同時(shí)處理多個(gè)請(qǐng)求。我已經(jīng)告訴過(guò)你,可擴(kuò)展性和效能與線程池大小無(wú)關(guān)。

為了可擴(kuò)展性和高效能,我們可以使用叢集和工作執(zhí)行緒。

聚類

假設(shè)您正在參加一場(chǎng)盛大的婚禮,有數(shù)千位賓客參加婚禮。有一間廚房,一名廚師正在為所有這些客人準(zhǔn)備食物。聽(tīng)起來(lái)不可預(yù)測(cè),對(duì)吧?如果您只有一名廚師,您就沒(méi)有充分利用廚房的全部資源。

這正是在多核心 CPU 上執(zhí)行的 Node JS 應(yīng)用程式中發(fā)生的情況,當(dāng)僅使用一個(gè)核心來(lái)處理所有請(qǐng)求時(shí)。因此,即使我們的機(jī)器具有多核心的能力,如果沒(méi)有集群,我們的應(yīng)用程式也只能在單核心上運(yùn)行。一個(gè)核心負(fù)責(zé)處理所有工作。

當(dāng)你的廚房裡有多個(gè)廚師正在工作時(shí),這就是集群。

叢集是一種讓單一 Node JS 應(yīng)用程式能夠有效利用多個(gè) CPU 核心的技術(shù)。

要實(shí)作集群,您必須使用 Node JS 中的集群模組。

const cluster = require('cluster');

透過(guò)使用此叢集模組,您可以建立 Node JS 應(yīng)用程式的多個(gè)實(shí)例。這些實(shí)例稱為工人。所有工作人員共用相同的伺服器連接埠並同時(shí)處理傳入請(qǐng)求。

叢集架構(gòu)中有兩種類型的進(jìn)程。

1.主流程:

Master進(jìn)程就像廚房裡的主廚管理工人。它初始化應(yīng)用程序,設(shè)定叢集環(huán)境,並將任務(wù)委託給工作進(jìn)程。它不直接處理應(yīng)用程式請(qǐng)求。

Master進(jìn)程是做什麼的?

  • 使用 cluster.fork() 方法建立多個(gè)工作進(jìn)程。如果工作人員意外崩潰或退出,它也會(huì)重新啟動(dòng)工作人員。

  • 它確保傳入請(qǐng)求分佈在所有工作流程中。在 Linux 上,這是由作業(yè)系統(tǒng)處理的,在 Windows 上,Node JS 本身充當(dāng)負(fù)載平衡器。

  • 它可以透過(guò)IPC(進(jìn)程間通訊)在worker之間進(jìn)行通訊。

2.工作進(jìn)程:

工作進(jìn)程是主進(jìn)程所建立的 Node JS 應(yīng)用程式的實(shí)例。每個(gè)進(jìn)程在單獨(dú)的 CPU 核心上獨(dú)立運(yùn)行並處理傳入請(qǐng)求。

工作進(jìn)程無(wú)法直接相互通信,它們透過(guò)主進(jìn)程進(jìn)行通訊。

工作進(jìn)程處理傳入的請(qǐng)求並執(zhí)行一些任務(wù),例如資料庫(kù)查詢、計(jì)算或任何應(yīng)用程式邏輯。

const cluster = require('cluster');

在這裡,我們先檢查這是主進(jìn)程。如果是,那麼它將創(chuàng)建工作進(jìn)程。

在我們的程式碼中,我使用 cluster.fork() 建立一個(gè)工作進(jìn)程。

但是,這不是創(chuàng)建工作進(jìn)程的理想方式。

假設(shè)您正在建立 4 個(gè)工作進(jìn)程,而您的系統(tǒng)有兩個(gè)核心。

為了解決這個(gè)問(wèn)題,而不是創(chuàng)建硬編碼的工作進(jìn)程,先找到 CPU 核心,然後考慮資料創(chuàng)建工作進(jìn)程。

const cluster = require('cluster');
const os = require('os');

if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);

  // Fork workers
    cluster.fork();
    cluster.fork();
    cluster.fork();
    cluster.fork();

} else {
  console.log(`Worker ${process.pid} is running`);
  // Worker logic (e.g., server setup) goes here
}

我使用雙核心系統(tǒng),所以輸出將如下所示。

const cluster = require('cluster');
const os = require('os');

if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);
  const numCPUs = os.cpus().length;

  // Fork workers
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  console.log(`Worker ${process.pid} is running`);
  // Worker logic (e.g., server setup) goes here
}

現(xiàn)在,您有一個(gè)問(wèn)題,如果您有雙核心 CPU,那麼為什麼要建立 4 個(gè)工作進(jìn)程?

這是因?yàn)檫壿嫼诵臄?shù)為 4,我的 CPU 支援超執(zhí)行緒或同步多執(zhí)行緒 (SMT)。

工作執(zhí)行緒

在餐廳裡,服務(wù)生接受訂單並將訂單交給廚師團(tuán)隊(duì),因?yàn)榕腼冃枰恍r(shí)間。如果有清潔桌子或任何其他與服務(wù)員相關(guān)的工作,那麼服務(wù)員就會(huì)這樣做。當(dāng)訂單準(zhǔn)備好後,廚師將食物回饋給服務(wù)員,服務(wù)員將這些食物提供給顧客。

這與工作執(zhí)行緒相關(guān)的場(chǎng)景相同。如果出現(xiàn)任何計(jì)算量大的任務(wù),例如大規(guī)模資料處理、複雜計(jì)算或繁重演算法,則主執(zhí)行緒會(huì)將此任務(wù)委託給工作執(zhí)行緒。該任務(wù)由工作執(zhí)行緒執(zhí)行,而不是主執(zhí)行緒。

*為什麼,這有幫助? *

我們知道 Node JS 事件循環(huán)是單執(zhí)行緒的,如果這種繁重的運(yùn)算工作由主執(zhí)行緒完成,那麼事件循環(huán)將被阻塞。如果您使用這些工作線程,那麼這些繁重的任務(wù)將交給工作線程,工作線程執(zhí)行這些任務(wù),而不是主線程,因此事件循環(huán)不會(huì)被阻塞。

工作執(zhí)行緒可以透過(guò)訊息傳遞系統(tǒng)與主執(zhí)行緒通信,並且可以使用結(jié)構(gòu)化克?。ㄉ钛}製)在執(zhí)行緒之間發(fā)送資料。

現(xiàn)在,我們正在嘗試模仿工作執(zhí)行緒的工作。

main.js(主執(zhí)行緒)

Master 12345 is running
Worker 12346 is running
Worker 12347 is running
Worker 12348 is running
Worker 12349 is running

worker.js(工作執(zhí)行緒)

const { Worker } = require('worker_threads');

function startWorker() {
  const worker = new Worker('./worker.js'); // Create a worker using worker.js

  // Listen for messages from the worker
  worker.on('message', (message) => {
    console.log('Message from worker:', message);
  });

  // Handle errors in the worker
  worker.on('error', (error) => {
    console.error('Worker error:', error);
  });

  // Handle worker exit
  worker.on('exit', (code) => {
    console.log(`Worker exited with code ${code}`);
  });

  // Send a message to the worker
  worker.postMessage({ num: 100 });
}

startWorker();

如果資料包含大型結(jié)構(gòu),它將被深度克隆並傳遞,這可能會(huì)產(chǎn)生一些效能開(kāi)銷。

程式碼的工作

  • Worker 類別用於產(chǎn)生新執(zhí)行緒。

  • 您可以使用worker.postMessage向worker發(fā)送數(shù)據(jù),並使用worker.on('message',callback)監(jiān)聽(tīng)訊息。

  • 在工作執(zhí)行緒中,parentPort 是與主執(zhí)行緒通訊的主要介面。

  • 您可以監(jiān)聽(tīng)來(lái)自主執(zhí)行緒(parentPort.on('message'))的訊息並使用parentPort.postMessage傳回訊息。

輸出將是:

const cluster = require('cluster');

現(xiàn)在,您還有一個(gè)問(wèn)題:為什麼我們不建立數(shù)百個(gè)工作執(zhí)行緒?

但是,原因是如果您建立的執(zhí)行緒多於核心數(shù)量,執(zhí)行緒將競(jìng)爭(zhēng) CPU 時(shí)間,導(dǎo)致上下文切換,這會(huì)導(dǎo)致成本高昂並降低整體效能。

什麼時(shí)候應(yīng)該在 Node.js 中使用叢集、工作執(zhí)行緒或兩者?

1。何時(shí)使用工作執(zhí)行緒?

  • CPU 密集任務(wù):

涉及大量計(jì)算的任務(wù),例如影像/視訊處理、資料壓縮或加密、機(jī)器學(xué)習(xí)推理、科學(xué)計(jì)算

  • 需要共享記憶體:

您需要在執(zhí)行緒之間有效地共享資料而不重複資料。

  • 單核心使用:

如果您的應(yīng)用程式只需要在單一進(jìn)程內(nèi)擴(kuò)展,但仍需要 CPU 密集型任務(wù)的並行性。

2.什麼時(shí)候使用聚類?

  • I/O 限制:

任務(wù)涉及處理大量客戶端請(qǐng)求,例如 Web、伺服器、聊天應(yīng)用程式和 API。叢集透過(guò)在所有 CPU 核心之間分配請(qǐng)求來(lái)幫助水平擴(kuò)展。

  • 孤立的記憶:

您的應(yīng)用程式不需要在進(jìn)程之間共享大量資料。

  • 多核心利用率:

您希望透過(guò)產(chǎn)生多個(gè) Node.js 進(jìn)程來(lái)利用所有可用的核心。

3.什麼時(shí)候同時(shí)使用叢集和工作執(zhí)行緒?

  • I/O 密集型 CPU 密集型任務(wù):

應(yīng)用程式處理 HTTP 請(qǐng)求,但卸載計(jì)算密集型任務(wù)。範(fàn)例:網(wǎng)頁(yè)伺服器處理檔案上傳並執(zhí)行影像大小調(diào)整或影片轉(zhuǎn)碼。

  • 高擴(kuò)充性:

您需要進(jìn)程級(jí)和執(zhí)行緒級(jí)並行性才能實(shí)現(xiàn)高吞吐量。在電子商務(wù)網(wǎng)站中,叢集可確保多個(gè)進(jìn)程處理傳入要求。工作執(zhí)行緒處理後臺(tái)任務(wù),例如產(chǎn)生個(gè)人化推薦。

謝謝。

歡迎提出問(wèn)題或提出任何建議。

如果您發(fā)現(xiàn)本文內(nèi)容豐富,請(qǐng)按讚。

以上是叢集和工作線程 - Node JS的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話題

Laravel 教程
1600
29
PHP教程
1502
276
如何在node.js中提出HTTP請(qǐng)求? 如何在node.js中提出HTTP請(qǐng)求? Jul 13, 2025 am 02:18 AM

在Node.js中發(fā)起HTTP請(qǐng)求有三種常用方式:使用內(nèi)置模塊、axios和node-fetch。 1.使用內(nèi)置的http/https模塊無(wú)需依賴,適合基礎(chǔ)場(chǎng)景,但需手動(dòng)處理數(shù)據(jù)拼接和錯(cuò)誤監(jiān)聽(tīng),例如用https.get()獲取數(shù)據(jù)或通過(guò).write()發(fā)送POST請(qǐng)求;2.axios是基於Promise的第三方庫(kù),語(yǔ)法簡(jiǎn)潔且功能強(qiáng)大,支持async/await、自動(dòng)JSON轉(zhuǎn)換、攔截器等,推薦用於簡(jiǎn)化異步請(qǐng)求操作;3.node-fetch提供類似瀏覽器fetch的風(fēng)格,基於Promise且語(yǔ)法簡(jiǎn)單

JavaScript數(shù)據(jù)類型:原始與參考 JavaScript數(shù)據(jù)類型:原始與參考 Jul 13, 2025 am 02:43 AM

JavaScript的數(shù)據(jù)類型分為原始類型和引用類型。原始類型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時(shí)復(fù)制副本,因此互不影響;引用類型如對(duì)象、數(shù)組和函數(shù)存儲(chǔ)的是內(nèi)存地址,指向同一對(duì)象的變量會(huì)相互影響。判斷類型可用typeof和instanceof,但需注意typeofnull的歷史問(wèn)題。理解這兩類差異有助於編寫(xiě)更穩(wěn)定可靠的代碼。

JavaScript時(shí)間對(duì)象,某人構(gòu)建了一個(gè)eactexe,在Google Chrome上更快的網(wǎng)站等等 JavaScript時(shí)間對(duì)象,某人構(gòu)建了一個(gè)eactexe,在Google Chrome上更快的網(wǎng)站等等 Jul 08, 2025 pm 02:27 PM

JavaScript開(kāi)發(fā)者們,大家好!歡迎閱讀本週的JavaScript新聞!本週我們將重點(diǎn)關(guān)注:Oracle與Deno的商標(biāo)糾紛、新的JavaScript時(shí)間對(duì)象獲得瀏覽器支持、GoogleChrome的更新以及一些強(qiáng)大的開(kāi)發(fā)者工具。讓我們開(kāi)始吧! Oracle與Deno的商標(biāo)之爭(zhēng)Oracle試圖註冊(cè)“JavaScript”商標(biāo)的舉動(dòng)引發(fā)爭(zhēng)議。 Node.js和Deno的創(chuàng)建者RyanDahl已提交請(qǐng)願(yuàn)書(shū),要求取消該商標(biāo),他認(rèn)為JavaScript是一個(gè)開(kāi)放標(biāo)準(zhǔn),不應(yīng)由Oracle

處理諾言:鏈接,錯(cuò)誤處理和承諾在JavaScript中 處理諾言:鏈接,錯(cuò)誤處理和承諾在JavaScript中 Jul 08, 2025 am 02:40 AM

Promise是JavaScript中處理異步操作的核心機(jī)制,理解鍊式調(diào)用、錯(cuò)誤處理和組合器是掌握其應(yīng)用的關(guān)鍵。 1.鍊式調(diào)用通過(guò).then()返回新Promise實(shí)現(xiàn)異步流程串聯(lián),每個(gè).then()接收上一步結(jié)果並可返回值或Promise;2.錯(cuò)誤處理應(yīng)統(tǒng)一使用.catch()捕獲異常,避免靜默失敗,並可在catch中返回默認(rèn)值繼續(xù)流程;3.組合器如Promise.all()(全成功才成功)、Promise.race()(首個(gè)完成即返回)和Promise.allSettled()(等待所有完成)

什麼是緩存API?如何與服務(wù)人員使用? 什麼是緩存API?如何與服務(wù)人員使用? Jul 08, 2025 am 02:43 AM

CacheAPI是瀏覽器提供的一種緩存網(wǎng)絡(luò)請(qǐng)求的工具,常與ServiceWorker配合使用,以提升網(wǎng)站性能和離線體驗(yàn)。 1.它允許開(kāi)發(fā)者手動(dòng)存儲(chǔ)如腳本、樣式表、圖片等資源;2.可根據(jù)請(qǐng)求匹配緩存響應(yīng);3.支持刪除特定緩存或清空整個(gè)緩存;4.通過(guò)ServiceWorker監(jiān)聽(tīng)fetch事件實(shí)現(xiàn)緩存優(yōu)先或網(wǎng)絡(luò)優(yōu)先等策略;5.常用於離線支持、加快重複訪問(wèn)速度、預(yù)加載關(guān)鍵資源及後臺(tái)更新內(nèi)容;6.使用時(shí)需注意緩存版本控制、存儲(chǔ)限制及與HTTP緩存機(jī)制的區(qū)別。

JS綜述:深入研究JavaScript事件循環(huán) JS綜述:深入研究JavaScript事件循環(huán) Jul 08, 2025 am 02:24 AM

JavaScript的事件循環(huán)通過(guò)協(xié)調(diào)調(diào)用棧、WebAPI和任務(wù)隊(duì)列來(lái)管理異步操作。 1.調(diào)用棧執(zhí)行同步代碼,遇到異步任務(wù)時(shí)交由WebAPI處理;2.WebAPI在後臺(tái)完成任務(wù)後將回調(diào)放入相應(yīng)的隊(duì)列(宏任務(wù)或微任務(wù));3.事件循環(huán)檢查調(diào)用棧是否為空,若為空則從隊(duì)列中取出回調(diào)推入調(diào)用棧執(zhí)行;4.微任務(wù)(如Promise.then)優(yōu)先於宏任務(wù)(如setTimeout)執(zhí)行;5.理解事件循環(huán)有助於避免阻塞主線程並優(yōu)化代碼執(zhí)行順序。

了解事件在JavaScript DOM事件中冒泡和捕獲 了解事件在JavaScript DOM事件中冒泡和捕獲 Jul 08, 2025 am 02:36 AM

事件冒泡是從目標(biāo)元素向外傳播到祖先節(jié)點(diǎn),事件捕獲則是從外層向內(nèi)傳播到目標(biāo)元素。 1.事件冒泡:點(diǎn)擊子元素後,事件依次向上觸發(fā)父級(jí)元素的監(jiān)聽(tīng)器,例如點(diǎn)擊按鈕後先輸出Childclicked,再輸出Parentclicked。 2.事件捕獲:設(shè)置第三個(gè)參數(shù)為true,使監(jiān)聽(tīng)器在捕獲階段執(zhí)行,如點(diǎn)擊按鈕前先觸發(fā)父元素的捕獲監(jiān)聽(tīng)器。 3.實(shí)際用途包括統(tǒng)一管理子元素事件、攔截預(yù)處理和性能優(yōu)化。 4.DOM事件流分為捕獲、目標(biāo)和冒泡三個(gè)階段,默認(rèn)監(jiān)聽(tīng)器在冒泡階段執(zhí)行。

超越地圖和過(guò)濾器的高階功能的JS綜述 超越地圖和過(guò)濾器的高階功能的JS綜述 Jul 10, 2025 am 11:41 AM

JavaScript數(shù)組中,除了map和filter,還有其他強(qiáng)大且不常用的方法。 1.reduce不僅能求和,還可計(jì)數(shù)、分組、展平數(shù)組、構(gòu)建新結(jié)構(gòu);2.find和findIndex用於查找單個(gè)元素或索引;3.some和every用於判斷是否存在或全部滿足條件;4.sort可排序但會(huì)改變?cè)瓟?shù)組;5.使用時(shí)注意複製數(shù)組避免副作用。這些方法使代碼更簡(jiǎn)潔高效。

See all articles