亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 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é)點線程池大小以同時處理多個請求。我已經(jīng)告訴過你,可擴(kuò)展性和效能與線程池大小無關(guān)。

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

聚類

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

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

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

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

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

const cluster = require('cluster');

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

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

1.主流程:

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

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

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

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

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

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

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

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

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

const cluster = require('cluster');

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

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

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

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

為了解決這個問題,而不是創(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)在,您有一個問題,如果您有雙核心 CPU,那麼為什麼要建立 4 個工作進(jìn)程?

這是因為邏輯核心數(shù)為 4,我的 CPU 支援超執(zhí)行緒或同步多執(zhí)行緒 (SMT)。

工作執(zhí)行緒

在餐廳裡,服務(wù)生接受訂單並將訂單交給廚師團(tuán)隊,因為烹飪需要一些時間。如果有清潔桌子或任何其他與服務(wù)員相關(guān)的工作,那麼服務(wù)員就會這樣做。當(dāng)訂單準(zhǔn)備好後,廚師將食物回饋給服務(wù)員,服務(wù)員將這些食物提供給顧客。

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

*為什麼,這有幫助? *

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

工作執(zhí)行緒可以透過訊息傳遞系統(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),它將被深度克隆並傳遞,這可能會產(chǎn)生一些效能開銷。

程式碼的工作

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

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

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

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

輸出將是:

const cluster = require('cluster');

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

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

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

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

  • CPU 密集任務(wù):

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

  • 需要共享記憶體:

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

  • 單核心使用:

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

2.什麼時候使用聚類?

  • I/O 限制:

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

  • 孤立的記憶:

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

  • 多核心利用率:

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

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

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

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

  • 高擴(kuò)充性:

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

謝謝。

歡迎提出問題或提出任何建議。

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

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
如何在node.js中提出HTTP請求? 如何在node.js中提出HTTP請求? Jul 13, 2025 am 02:18 AM

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

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

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

React與Angular vs Vue:哪個JS框架最好? React與Angular vs Vue:哪個JS框架最好? Jul 05, 2025 am 02:24 AM

選哪個JavaScript框架最好?答案是根據(jù)需求選擇最適合的。 1.React靈活自由,適合需要高度定制、團(tuán)隊有架構(gòu)能力的中大型項目;2.Angular提供完整解決方案,適合企業(yè)級應(yīng)用和長期維護(hù)的大項目;3.Vue上手簡單,適合中小型項目或快速開發(fā)。此外,是否已有技術(shù)棧、團(tuán)隊規(guī)模、項目生命週期及是否需要SSR也都是選擇框架的重要因素??傊?,沒有絕對最好的框架,適合自己需求的就是最佳選擇。

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

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

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

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

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

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

利用Array.Prototype方法用於JavaScript中的數(shù)據(jù)操作 利用Array.Prototype方法用於JavaScript中的數(shù)據(jù)操作 Jul 06, 2025 am 02:36 AM

JavaScript數(shù)組內(nèi)置方法如.map()、.filter()和.reduce()可簡化數(shù)據(jù)處理;1).map()用於一對一轉(zhuǎn)換元素生成新數(shù)組;2).filter()按條件篩選元素;3).reduce()用於聚合數(shù)據(jù)為單一值;使用時應(yīng)避免誤用導(dǎo)致副作用或性能問題。

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

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

See all articles