node.js之---子線程(child_process)模塊

為什么需要子線程(child_process)模塊

Worker Threads 的基本概念

如何使用 Worker Threads

Worker Threads 的性能

Worker 線程的優勢和限制

進階用法:共享內存

為什么需要子線程(child_process)模塊

在 Node.js 中,Worker Threads 模塊worker_threads)提供了一種在?Node.js 單線程 中使用多線程的方式,從而能夠更高效地處理計算密集型任務,避免阻塞主線程(事件循環)。這是 Node.js 中引入的一種并發處理機制,旨在提高性能,尤其是在需要大量計算的情況下。

Node.js 默認是單線程的,它通過事件循環來處理異步操作。雖然 Node.js 可以在后臺異步執行 I/O 操作(如文件讀取、數據庫查詢等),但它的事件循環在處理計算密集型任務時會被阻塞。這意味著長時間運行的 CPU 密集型任務(如大型數據處理或算法計算)可能會阻塞事件循環,從而影響整個應用的響應能力。

為了克服這個問題,Node.js 引入了 Worker Threads 模塊,它允許你在單個進程中創建多個線程,每個線程都擁有自己的執行上下文,并可以并行地處理任務。

Worker Threads 的基本概念

  • 主線程(Main thread):主線程是 Node.js 應用的默認執行環境。所有的 I/O 操作和事件循環都在主線程中進行。
  • Worker 線程(Worker threads):每個 Worker 線程擁有自己的事件循環和內存空間。它們與主線程并行運行,能夠處理獨立的任務。

如何使用 Worker Threads

要使用 Worker Threads,首先需要引入 worker_threads 模塊。每個 Worker 線程都可以通過 Worker 類來創建,主線程和 Worker 線程之間的通信是通過 消息傳遞 實現的。主線程可以向 Worker 線程發送消息,Worker 線程也可以向主線程發送結果。

Worker Threads 的核心 API
  • worker_threads.Worker: 用于創建一個新的 Worker 線程。
  • worker_threads.isMainThread: 一個布爾值,用來判斷當前代碼是否在主線程中執行。
  • worker_threads.parentPort: 主線程和 Worker 線程之間的通信通道。
  • worker_threads.workerData: 允許向 Worker 線程傳遞數據。
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');if (isMainThread) {// 主線程代碼console.log('主線程正在運行');// 創建 Worker 線程const worker = new Worker(__filename, {workerData: { start: 1, end: 5 }});// 監聽 Worker 線程返回的消息worker.on('message', (result) => {console.log(`主線程收到結果:${result}`);});worker.on('error', (err) => {console.error('Worker 線程發生錯誤:', err);});worker.on('exit', (code) => {if (code !== 0) {console.error(`Worker 線程退出時的錯誤代碼: ${code}`);}});
} else {// Worker 線程代碼console.log('Worker 線程正在運行');const { start, end } = workerData;// 執行任務并將結果返回給主線程let result = 0;for (let i = start; i <= end; i++) {result += i;}parentPort.postMessage(result);  // 向主線程發送結果
}

Worker Threads 的性能

  • 線程池大小:默認情況下,Worker Threads?模塊使用系統的線程池。每個 Worker 線程在獨立的 CPU 核心上運行,理論上可以并行執行多個計算任務。
  • 內存隔離:每個 Worker 線程擁有獨立的內存空間和執行上下文,不會與其他線程共享數據,因此可以避免傳統多線程編程中的競態條件問題。
  • 開銷:每個 Worker 線程都需要一定的資源開銷(內存、啟動時間等),所以要謹慎創建過多的 Worker 線程。

Worker 線程的優勢和限制

優點

  • 避免阻塞:Worker 線程可以并行處理計算密集型任務,不會阻塞主線程的事件循環。
  • 內存隔離:每個 Worker 線程有獨立的內存空間,避免了共享內存帶來的問題。
  • 更好的多核利用:可以利用多核 CPU 來并行處理任務,充分發揮硬件性能。

限制

  • 消息傳遞開銷:線程間的通信是基于消息傳遞的,這可能會引入一定的延遲,尤其是在需要頻繁交互的場景下。
  • 內存限制:每個 Worker 線程都需要占用一定的內存和資源,創建大量的 Worker 線程可能導致內存消耗過高。
  • 無法共享內存:Worker 線程之間沒有共享內存空間,雖然可以通過?SharedArrayBuffer?實現共享內存,但這需要額外的管理和同步機制。

進階用法:共享內存

雖然 Worker 線程之間沒有直接的內存共享,但可以通過 SharedArrayBuffer 實現內存共享。SharedArrayBuffer 是一種允許在多個線程之間共享內存的結構,適用于需要高效交換大量數據的場景。

const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
const { SharedArrayBuffer, Int32Array } = require('buffer');if (isMainThread) {const sharedBuffer = new SharedArrayBuffer(4 * Int32Array.BYTES_PER_ELEMENT);const sharedArray = new Int32Array(sharedBuffer);// 將共享內存傳遞給 Worker 線程const worker = new Worker(__filename, { workerData: sharedBuffer });worker.on('message', () => {console.log(`Main Thread: Shared memory content: ${sharedArray[0]}`);});
} else {const sharedArray = new Int32Array(workerData);// 修改共享內存sharedArray[0] = 42;parentPort.postMessage('done');
}

在這個例子中,SharedArrayBuffer 允許主線程和 Worker 線程之間共享內存。通過 Int32Array 視圖訪問和修改這塊內存。

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

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

相關文章

【深度學習基礎之多尺度特征提取】多尺度圖像增強(Multi-Scale Image Augmentation)是如何在深度學習網絡中提取多尺度特征的?附代碼

【深度學習基礎之多尺度特征提取】多尺度圖像增強&#xff08;Multi-Scale Image Augmentation&#xff09;是如何在深度學習網絡中提取多尺度特征的&#xff1f;附代碼 【深度學習基礎之多尺度特征提取】多尺度圖像增強&#xff08;Multi-Scale Image Augmentation&#xff0…

鴻蒙應用開發 - 如何去掉字符串中空格

鴻蒙應用開發 - 如何去掉字符串中空格 在鴻蒙應用開發中&#xff0c;如果你使用的是ArkTS&#xff08;Ark TypeScript&#xff09;&#xff0c;可以通過JavaScript或TypeScript內置的字符串方法來去除字符串中的空格。以下是一些常用的方法&#xff1a; trim()&#xff1a;去…

最新版Chrome瀏覽器加載ActiveX控件之CFCA安全輸入控件

背景 CFCA安全輸入控件用于保證用戶在瀏覽器、桌面客戶端、移動客戶端中輸入信息的安全性&#xff0c;防止運行在用戶系統上的病毒、木馬等惡意程序入侵竊取用戶輸入的敏感信息。確保用戶輸入、本地緩存、網絡傳輸整個流程中&#xff0c;輸入的敏感信息不被竊取。廣泛應用于銀行…

vSAN手動平衡磁盤

原創作者&#xff1a;運維工程師 謝晉 vSAN手動平衡磁盤 vSAN手動平衡磁盤 vSAN手動平衡磁盤 1、ssh登錄到VCSA&#xff0c;然后登錄到 Ruby vSphere 控制臺 (RVC) # rvc administratorvsphere.local10.10.0.202、切換到計算機命名空間 0 / 1 10.10.0.20/ > cd 1 /10.…

接口測試面試題

接口測試在軟件測試中占據重要位置&#xff0c;無論是功能測試還是性能測試&#xff0c;接口的穩定性至關重要。以下總結了一些常見的接口測試面試題&#xff0c;幫助你從容應對面試挑戰&#xff01; 面試官常說&#xff1a;“接口測試是測試的重頭戲&#xff0c;了解接口的設計…

【前端,TypeScript】TypeScript速成(六):函數

函數 函數的定義 定義一個最簡單的加法函數&#xff1a; function add(a: number, b: number): number {return a b }&#xff08;可以看到 JavaScript/TypeScript 的語法與 Golang 也非常的相似&#xff09; 調用該函數&#xff1a; console.log(add(2, 3)) // out [LOG…

css的選擇器有哪些?優先級?

元素選擇器&#xff1a;選擇所有指定標簽類型的元素。 類選擇器&#xff1a;選擇具有指定類的所有元素&#xff0c;類名前有一個點 ID 選擇器&#xff1a;選擇具有指定 id 屬性的元素&#xff0c;ID 前有一個井號屬性選擇器&#xff1a;選擇具有指定屬性或屬性值的元素后代選…

Vue-Router之嵌套路由

在路由配置中&#xff0c;配置children import Vue from vue import VueRouter from vue-routerVue.use(VueRouter)const router new VueRouter({mode: history,base: import.meta.env.BASE_URL,routes: [{path: /,redirect: /home},{path: /home,name: home,component: () &…

Easy-Trans反向翻譯+Excel導入最佳實踐

1、概述 實現用戶excel上傳、解析、對于用戶輸入的中文翻譯為字典碼或者id&#xff0c;實現用戶輸入的參數校驗&#xff0c;最后入庫。如果用戶輸入的參數有問題&#xff0c;返回校驗結果給前端。 excel解析使用My-Excel組件&#xff0c;校驗使用hibernate-validator&#xff…

高效管理 Nginx 的利器:nginxWebUI 指南和 Docker 部署安裝過程

前言 Nginx WebUI 是一個為 Nginx 提供圖形化管理界面的工具。通過 WebUI&#xff0c;用戶可以輕松管理 Nginx 配置&#xff0c;而無需直接編輯配置文件&#xff0c;尤其適合新手用戶和頻繁修改配置的場景。 官網文檔&#xff1a;nginxWebUI - 文檔 本文將分享為什么選擇 ngin…

SpringCloud源碼-openFeign

LoadBalancer默認只有nacos服務發現器 openFeign與springcloud loadbalancer的結合點 openFeign通過spring cloud loadbalancer進行負載均衡&#xff0c;spring cloud loadbalancer通過discovery client獲取nacos的機器列表&#xff0c;然后底層進行負載均衡。

基于微信小程序的校園自助打印系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業六年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了多年的設計程序開發&#xff0c;開發過上千套設計程序&#xff0c;沒有什么華麗的語言&#xff0c;只有實…

從 ELK Stack 到簡單 — Elastic Cloud Serverless 上的 Elastic 可觀察性

作者&#xff1a;來自 Elastic Bahubali Shetti, Chris DiStasio 宣布 Elastic Cloud Serverless 上的 Elastic Observability 正式發布 — 一款完全托管的可觀察性解決方案。 隨著組織規模的擴大&#xff0c;一個能夠處理分布式云環境的復雜性并提供實時洞察的可觀察性解決方…

21.<基于Spring圖書管理系統②(圖書列表+刪除圖書+更改圖書)(非強制登錄版本完結)>

PS&#xff1a; 開閉原則 定義和背景 開閉原則&#xff08;Open-Closed Principle, OCP&#xff09;&#xff0c;也稱為開放封閉原則&#xff0c;是面向對象設計中的一個基本原則。該原則強調軟件中的模塊、類或函數應該對擴展開放&#xff0c;對修改封閉。這意味著一個軟件實體…

三、GIT與Github推送(上傳)和克隆(下載)

GIT與Github推送&#xff08;上傳&#xff09;和克隆&#xff08;下載&#xff09; 一、配置好SSH二、在Github創建倉庫三、git克隆&#xff08;下載&#xff09;文件四、git推送&#xff08;上傳&#xff09;文件到遠程倉庫 一、配置好SSH Git與Github上傳和下載時需要使用到…

網工日記:FTP兩種工作模式的區別

FTP 的主動模式和被動模式在連接建立的發起方、數據傳輸端口以及對網絡環境的適應性等方面存在明顯區別&#xff1a; 1. 連接發起方 主動模式&#xff1a;數據連接由服務器主動發起。在控制連接建立后&#xff0c;客戶端通過 PORT 命令告知服務器自己用于接收數據的臨時端口號…

【數字化】華為一體四面細化架構藍圖

導讀&#xff1a;華為的“一體四面”企業架構設計方法是一種綜合性的管理框架&#xff0c;它通過業務架構、信息架構、應用架構和技術架構的集成設計&#xff0c;構建出一個既符合業務需求&#xff0c;又具備高度靈活性和可擴展性的IT系統。這種架構設計方法強調從業務視角出發…

【linux板卡】lubancat通過vnc遠程訪問桌面

魯班貓開發板通過遠程VNC連接桌面&#xff1a; 硬件&#xff1a;lubancat2&#xff0c;網線 軟件&#xff1a;ssh軟件&#xff0c;vnc viewer 參考鏈接&#xff1a;https://training.eeworld.com.cn/video/38821 1、ssh連接lubancat2 &#xff0c;輸入ifconfig查看ip 2、輸入 …

解決Springboot整合Shiro+Redis退出登錄后不清除緩存

解決Springboot整合ShiroRedis退出登錄后不清除緩存 問題發現問題解決 問題發現 如果再使用緩存管理Shiro會話時&#xff0c;退出登錄后緩存的數據應該清空。 依賴文件如下&#xff1a; <dependency><groupId>org.springframework.boot</groupId><arti…

2024國城杯 Web

這四道題目Jasper大佬都做了鏡像可以直接拉取進行復現 https://jaspersec.top/2024/12/16/0x12%20%E5%9B%BD%E5%9F%8E%E6%9D%AF2024%20writeup%20with%20docker/ n0ob_un4er 這道題沒有復現成功, 不知道為啥上傳了文件, 也在 /tmp目錄下生成了sess_PHPSESSID的文件, 但是就是…