Node.js worker_threads:并發 vs 并行

一、核心結論

Node.js 的 worker_threads 模塊實現的是 并行計算 ,而非傳統意義上的“并發”。其通過操作系統級線程實現多核 CPU 的并行執行,同時保留 Node.js 單線程事件循環的并發模型。

二、關鍵概念解析

1. 并發(Concurrency) vs 并行(Parallelism)

  • 并發

    • 指系統同時處理多個任務的能力,但任務可能交替執行(如單核 CPU 通過時間片輪轉)。
    • Node.js 主線程 的事件循環是典型的并發模型,通過非阻塞 I/O 和事件隊列實現。
  • 并行

    • 指多個任務同時執行,需多核 CPU 支持,每個任務運行在獨立核心上。
    • worker_threads 通過創建操作系統級線程實現并行計算。

2. Node.js 的線程模型

  • 主線程

    • 單線程,運行事件循環,處理 I/O 和事件回調。
    • 阻塞主線程會導致整個進程卡頓。
  • Worker 線程

    • 每個 Worker 線程是獨立的 JavaScript 運行時,擁有自己的事件循環和堆內存。
    • 線程由操作系統的系統線程支持,可綁定到不同 CPU 核心,實現并行執行。

三、worker_threads 的并行機制

1. 多核利用

  • 默認線程數

    • Node.js 根據 CPU 核心數自動創建線程池(通常等于核心數)。
    • 例如,4 核 CPU 默認創建 4 個線程,每個線程綁定到一個核心。
  • 任務分配

    • 主線程通過 Worker 類創建子線程,并將任務通過 postMessage 分發。
    • 子線程執行任務后,通過 parentPort.postMessage 返回結果。

2. 線程調度

  • 操作系統調度

    • Worker 線程由操作系統調度到不同 CPU 核心,實現真正的并行執行。
    • 線程間通過 SharedArrayBuffer 或消息傳遞通信,避免阻塞主線程。
  • 示例:并行計算斐波那契數列

    // main.js
    const { Worker } = require('worker_threads');
    const numCPUs = require('os').cpus().length;for (let i = 0; i < numCPUs; i++) {const worker = new Worker('./fibonacciWorker.js');worker.postMessage(40); // 每個線程計算第40個斐波那契數
    }
    
    // fibonacciWorker.js
    const { parentPort } = require('worker_threads');function fibonacci(n) {return n <= 1 ? n : fibonacci(n - 1) + fibonacci(n - 2);
    }parentPort.on('message', (n) => {const result = fibonacci(n);parentPort.postMessage(result);
    });
    

四、對比傳統并發模型

1. 事件循環(主線程)

  • 特點

    • 單線程,通過非阻塞 I/O 和事件隊列實現高并發。
    • 適合 I/O 密集型任務(如網絡請求、文件操作)。
  • 局限

    • CPU 密集型任務會阻塞事件循環,導致其他任務無法執行。

2. Worker 線程(并行計算)

  • 特點

    • 多線程,利用多核 CPU 并行執行 CPU 密集型任務。
    • 線程間通過消息傳遞或共享內存通信,避免阻塞主線程。
  • 適用場景

    • 大型計算(如加密、圖像處理、機器學習)。
    • 并行化數據庫查詢或數據處理任務。

五、性能監控與驗證

1. 監控 CPU 核心利用率

  • Linux

    top -H -p <PID>  # 查看進程內所有線程的CPU使用率
    
  • Node.js

    const { threadId } = require('worker_threads');
    console.log(`Worker ${threadId} 正在運行`);
    

2. 并行計算驗證

  • 示例:計算 π 的近似值(蒙特卡洛方法)

    // main.js
    const { Worker } = require('worker_threads');
    const numWorkers = 4;
    const totalSamples = 1e8;const workers = Array.from({ length: numWorkers }, (_, i) => {const worker = new Worker('./piWorker.js');worker.postMessage({ samples: totalSamples / numWorkers });return worker;
    });let results = [];
    workers.forEach((worker, i) => {worker.on('message', (result) => {results[i] = result;if (results.length === numWorkers) {const pi = results.reduce((sum, val) => sum + val) / numWorkers;console.log(`π ≈ ${pi}`);}});
    });
    
    // piWorker.js
    const { parentPort } = require('worker_threads');parentPort.on('message', ({ samples }) => {let inside = 0;for (let i = 0; i < samples; i++) {const x = Math.random();const y = Math.random();if (x * x + y * y <= 1) inside++;}parentPort.postMessage(4 * inside / samples);
    });
    

六、總結

  • worker_threads 是并行計算

    • 利用多核 CPU,通過操作系統級線程實現任務并行執行。
    • 適用于 CPU 密集型任務,避免阻塞主線程的事件循環。
  • 與主線程的并發模型互補

    • 主線程處理 I/O 和事件驅動的并發。
    • Worker 線程處理 CPU 密集型任務的并行計算。

通過合理使用 worker_threads,您可以充分發揮多核 CPU 的性能優勢,構建高效、響應迅速的 Node.js 應用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913612.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913612.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913612.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

gloo 多卡訓練

我們遇到了分布式訓練中的通信超時問題&#xff08;Connection closed by peer&#xff09;。根據錯誤信息&#xff0c;問題發生在梯度同步的屏障&#xff08;barrier&#xff09;操作時。以下是針對此問題的優化措施和代碼修改&#xff1a; 優化措施&#xff1a; 增強通信穩…

【Docker】在銀河麒麟ARM環境下離線安裝docker

1、前言 采用離線安裝的方式。 關于離線安裝的方式官網有介紹&#xff0c;但是說的很簡單&#xff0c;網址&#xff1a;Binaries | Docker Docs 官網介紹的有幾種主流linux系統的安裝方式&#xff0c;但是沒有kylin的&#xff0c;所以在此記錄一下。 在安裝過程中也遇到了些…

AUTOSAR進階圖解==>AUTOSAR_SWS_SOMEIPTransformer

AUTOSAR SOME/IP 轉換器規范詳解 基于AUTOSAR標準的SOME/IP轉換器協議解析與實現指南目錄 1. 介紹與功能概述2. SOME/IP架構 2.1 SOME/IP轉換器架構2.2 組件解釋2.3 層級說明 3. SOME/IP通信流程 3.1 客戶端/服務器通信序列3.2 通信流程解釋 4. SOME/IP消息結構 4.1 消息結構類…

Python 機器學習核心入門與實戰進階 Day 5 - 模型調參與交叉驗證技巧(GridSearchCV、KFold)

? 今日目標 理解模型調參的重要性&#xff08;避免欠擬合/過擬合&#xff09;掌握 GridSearchCV 的使用方法學習 K 折交叉驗證的基本流程與意義對比不同參數組合的表現使用 Pipeline 簡化流程&#xff08;進階&#xff09;&#x1f4d8; 一、調參思路方法描述Grid Search窮舉所…

Python打卡:Day47

復習日 浙大疏錦行

ACE-Step:AI音樂生成基礎模型

ACE-Step是什么 ACE-Step 是 ACE Studio 和 StepFun 聯合推出的一款開源音樂生成基礎模型&#xff0c;專為高效、連貫、可控的音樂創作而設計。它融合了擴散模型、深度壓縮自編碼器&#xff08;DCAE&#xff09;和輕量級線性變換器&#xff0c;生成速度比傳統大模型快約 15 倍…

Web前端: :is(通用選擇器)

:is(通用選擇器)CSS中的 :is() 選擇器是?個功能強?的偽類選擇器&#xff0c;它?于簡化復雜的選擇器&#xff0c;特別是在處理多個相似的選擇器時。:is() 選擇器接受 ?個選擇器列表作為參數&#xff0c;然后匹配列表中任何?個選擇器所選中的元素。:is() 選擇器核心概念基本…

【學習筆記】網絡設備(華為交換機)基礎知識 24 —— 以太網子接口基礎知識

**總結&#xff1a;分享華為交換機以太網子接口基礎知識&#xff1a;包含子接口的簡介、功能、分類以及二層以太網子接口配置終結子接口、三層以太網子接口配置終結子接口和檢查配置結果的相關命令 ** 一、子接口的概念 1、子接口的簡介以太網子接口&#xff1a;?是通過協議和…

在Docker中安裝nexus3(作為maven私服)

1. 為什么我不推薦安裝nexus2&#xff1f; 有兩個原因&#xff1a;&#xff08;1&#xff09;nexus2安裝麻煩&#xff0c;nexus3安裝更方便 &#xff08;2&#xff09;Nexus 3相對于Nexus 2進行了一些重要的改進和增強。它引入了新的存儲引擎、更多的倉庫類型支持、改進的權限…

一、MySQL 8.0 之《EXPLAIN ANALYZE 執行計劃》

文章目錄一、MySQL EXPLAIN ANALYZE 執行計劃指南主要功能實際執行性能分析詳細的執行統計性能瓶頸識別與普通 EXPLAIN 的區別使用場景查詢優化問題診斷總結二、EXPLAIN ANALYZE 執行計劃樣例分析執行順序解讀逐行詳細解釋第 7 行 (最內層)第 6 行第 5 行第 4 行第 3 行第 2 行…

Google I/O Extended :2025 Flutter 的現狀與未來

大家好&#xff0c;我是 Flutter GDE 郭樹煜&#xff0c;Github GSY 項目的維護人&#xff0c;今天主要分享的內容是「Flutter 的現狀與未來」&#xff0c;可能今天更多會是信息科普類型的內容&#xff0c;主要是分享關于 Flutter 的現狀與未來 現狀 其實 Flutter 從開源到現在…

軟考(軟件設計師)數據庫原理:事務管理,備份恢復,并發控制

數據庫事務管理與備份恢復 事務&#xff08;Transaction&#xff09; 是數據庫管理系統中執行的一個不可分割的工作單元&#xff0c;它包含一組 SQL 操作&#xff0c;這些操作要么全部成功執行&#xff0c;要么全部不執行。 事務的四大特性&#xff08;ACID&#xff09;&…

【牛客刷題】相遇

文章目錄 一、題目介紹1.1 題目描述1.2 輸入描述1.3 輸出描述1.4 示例二、解題思路2.1 核心算法設計2.2 性能優化關鍵2.3 算法流程圖三、解法實現3.1 解法一:基礎實現3.1.1 初級版本分析3.2 解法二:優化版本(推薦)3.2.1 優化版本分析一、題目介紹 1.1 題目描述 街道可以看…

uni-app 下拉搜索多選 支持自己創建數據

組件 /components/selectmul.vue <template><view class="multi-select-container"><view class="input-dropdown-container"><view class="" v-if="selectlist&&selectlist[0]"><text class=&qu…

nmon使用方法

安裝方法 方法1&#xff1a; 最簡單方法&#xff1a; #dnf install nom 驗證 執行命令&#xff1a; #nmon 方法2&#xff1a; 下載安裝包安裝&#xff0c;下載地址 官網&#xff1a;nmon and njmon | Site / Download 或者&#xff1a;https://sourceforge.net/project…

Google AI 剛剛開源 MCP 數據庫工具箱,讓 AI 代理安全高效地查詢數據庫

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

數學建模的一般步驟

歸納編程學習的感悟&#xff0c; 記錄奮斗路上的點滴&#xff0c; 希望能幫到一樣刻苦的你&#xff01; 如有不足歡迎指正&#xff01; 共同學習交流&#xff01; &#x1f30e;歡迎各位→點贊 &#x1f44d; 收藏? 留言?&#x1f4dd; 青春由磨礪而出彩&#xff0c;人生因奮…

【web安全】SQLMap 參數深度解析:--risk 與 --level 詳解

目錄 簡介 一、--risk 參數&#xff1a;測試風險控制 1. 基本定義 2. 各級別詳細對比 risk1 (默認) risk2 risk3 3. 使用建議 二、--level 參數&#xff1a;測試深度控制 1. 基本定義 2. 各級別詳細對比 level1 (默認) level2 level3 level4 level5 3. 技術實…

YOLO在自動駕駛交通標志識別中的應用與優化【附代碼】

文章目錄YOLO在自動駕駛交通標志識別中的應用與優化引言1. YOLO算法概述1.1 YOLO的核心思想1.2 YOLO的演進2. 交通標志識別的挑戰2.1 數據集特性2.2 性能指標要求3. YOLO模型優化策略3.1 數據增強改進3.2 注意力機制集成3.3 針對小目標的改進4. 完整實現示例4.1 模型訓練代碼4.…

開源鴻蒙(OpenHarmony)桌面版全面解析:架構適配、設備支持與開發實戰

摘要:深度剖析OpenHarmony 4.0+桌面版的技術演進,揭秘其在X86/國產芯片設備的落地實踐,附源碼獲取與開發板實戰指南 一、OpenHarmony桌面版架構突破 1.1 跨平臺內核適配 開源鴻蒙通過 多內核混合架構 實現全場景覆蓋: X86架構:集成Linux內核適配層(kernel/linux),支持…