当前位置: 首页 > news >正文

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 视图访问和修改这块内存。

相关文章:

node.js之---子线程(child_process)模块

为什么需要子线程&#xff08;child_process&#xff09;模块 Worker Threads 的基本概念 如何使用 Worker Threads Worker Threads 的性能 Worker 线程的优势和限制 进阶用法&#xff1a;共享内存 为什么需要子线程&#xff08;child_process&#xff09;模块 在 Node.js…...

Json字符串解析失败

通过第三方服务&#xff0c;拿到响应体的data对象&#xff08;拿到的时候对象是有值的&#xff09; 通过JSON.parseObject方法&#xff0c;拿到的对象&#xff0c;值为null 通过查看对应的json字符串&#xff0c;发现命名不一样... JSONField SeriealizedName注解是用来解析j…...

LeetCode算法题——螺旋矩阵ll

题目描述 给你一个正整数n&#xff0c;生成一个包含1到n2所有元素&#xff0c;且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix 。 示例 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]题解 思路&#xff1a; 将整个过程分解为逐圈填充的过程&#xf…...

【开源社区openEuler实践】hpcrunner

title: 探索 Hpcrunner&#xff1a;高性能计算的得力助手 date: ‘2024-12-31’ category: blog tags: Hpcrunner高性能计算任务调度资源优化 sig: HPC archives: ‘2024-12’ author:way_back summary: Hpcrunner 作为高性能计算领域的一款实用工具&#xff0c;专注于优化任务…...

linux下安装达梦数据库v8详解

目录 操作系统、数据库 1、下载达梦数据库 2、安装前准备 2.1、建立数据库用户和组 2.2、修改文件打开最大数 2.3、挂载镜像 2.4、新建安装目录 3、数据库安装 4、配置环境变量 5、初始化数据库实例 6、注册服务 7、使用数据库 8、卸载数据库 9、多实例管理 10、…...

Redis的常用命令

Redis中文字典网站 redis 命令手册https://redis.com.cn/commands.html Keys * 查看当前库所有的key exists ke 判断某个key是否存在 type key查看你的key是什么类型 Del key删除执行的key数据 unlink key非阻塞删除&#xff0c;仅仅将keys从keyspace元数据中删除&#xf…...

Docker入门常用命令总结

1.从远程仓库拉取一个纯净的镜像 docker pull docker .io/centos 2.创建并进入容器&#xff08;左外右内&#xff09; docker run --name xxx -dit 镜像id&#xff08;镜像名称:Tag&#xff09; /bin/bash 【参数必须放在镜像ID之前】 -i 让Docker分配一个伪终端&#xff0c;并…...

【Qt】容器控件、布局管理控件

目录 容器控件 QGroupBox QTabWidget 布局管理控件 QVBoxLayout 例子&#xff1a; QHBoxLayout 例子&#xff1a; QGridLayout 例子&#xff1a; 例子&#xff1a; QFormLayout 例子&#xff1a; QSpacerItem 例子&#xff1a; 容器控件 QGroupBox 表示一个带有…...

cesium小知识:常见的20多种property详解

要详细解释 Cesium 中所有的 Property 类,内容确实会非常丰富且详尽。 Property 基础 Property 是 Cesium 中用于表示随时间或条件变化的值的基础类。它允许你定义属性值如何根据时间、用户交互或其他逻辑动态改变。Property 的设计使得你可以创建复杂的动画和交互效果,而…...

图数据库 | 17、高可用分布式设计(上)

我们在前面的文章中&#xff0c;探索了多种可能的系统扩展方式&#xff0c;以及每种扩展方式的优劣。 本篇文章将通过具体的架构设计方案来对每一种方案的设计、投入产出比、各项指标与功能&#xff0c;以及孰优孰劣等进行评价。 在设计高性能、高可用图数据库的时候&#xf…...

1.运控概述

以下并不是我原创&#xff08;包括图片&#xff09;&#xff0c;都是来源于网络收集。如CSDN博主&#xff0c;朝夕教育&#xff0c;AI等。 什么是运动控制 运控是指“控制移动”之意&#xff0c;可以利用各种电机进行位置控制等操作&#xff0c;让机器听懂你的指令。 什么是…...

DuckDB:密钥管理器及其应用

密钥管理器(Secrets Manager)为所有使用密钥的后端提供了统一的用户界面。密钥信息可以被限定范围&#xff0c;因此不同的存储前缀可以有不同的密钥信息&#xff0c;例如允许在单个查询中连接跨组织的数据。密钥也可以持久化&#xff0c;这样就不需要在每次启动DuckDB时都指定它…...

单元测试4.0+思路总结

Jmockit使用笔记_增加代码覆盖率_覆盖try catch_使用new MockUp私有方法-CSDN博客 一般使用new MockUp模拟被测试代码中的私有方法(常用&#xff09; 使用new Expetations模拟被测试代码中的方法?...

epoll 水平ET跟边缘LT触发的区别是什么

epoll默认的是水平触发 意思就是当我们depoll默认的是水平触发 LT 模式&#xff08;水平触发&#xff09; 工作机制&#xff1a;在 LT 模式下&#xff0c;只要文件描述符&#xff08;例如套接字&#xff09;对应的 I/O 缓冲区中有数据可读或者可写空间&#xff08;对于写操作…...

设计模式 创建型 单例模式(Singleton Pattern)与 常见技术框架应用 解析

单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;旨在确保某个类在应用程序的生命周期内只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。这种设计模式在需要控制资源访问、避免频繁创建和销毁对象的场景中尤为有用。 一、核心…...

Java项目实战II基于微信小程序的家庭大厨(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在快节奏的生活中&#xff0c;家庭聚餐成为了连接亲情…...

【JVM】总结篇-字节码篇

字节码篇 Java虚拟机的生命周期 JVM的组成 Java虚拟机的体系结构 什么是Java虚拟机 虚拟机&#xff1a;指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 &#xff0c;是物理机的软件实现。常用的虚拟机有VMWare&#xff0c;Visual Box&…...

HTML——28.音频的引入

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>音频引入</title></head><body><!--audio:在网页中引入音频当属性名和属性值一样&#xff0c;可以只写属性名src属性:指定音频文件路径&#xff0c;必…...

Visual Point Cloud Forecasting enables Scalable Autonomous Driving——点云论文阅读(12)

此内容是论文总结,重点看思路!! 文章概述 这篇文章介绍了一个名为 ViDAR 的视觉点云预测框架,它通过预测历史视觉输入生成未来点云,作为自动驾驶的预训练任务。ViDAR 集成了语义、三维几何和时间动态信息,有效提升了感知、预测和规划等自动驾驶核心任务的性能。实验表明…...

《Xsens动捕与人形机器人训练》讲座将于1月9日下午2:30在线上召开

《Xsens动捕与人形机器人训练》讲座将于1月9日下午2:30在线上召开&#xff0c;本次讲座中来自Xsens的人形机器人与动捕技术专家Jeffrey Muller与Dennis Kloppenburg不仅将就Xsens动作捕捉系统与人形机器人行为训练中的实际应用进行详细讲解&#xff0c;同时还会对目前大家所关注…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...