当前位置: 首页 > 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;同时还会对目前大家所关注…...

别再手动数了!用Apache POI和iText,5行代码搞定Java批量统计文档页数

5行代码实现Java批量文档页数统计&#xff1a;Apache POI与iText的高效实践 当你在整理年度报告、审计文档或准备印刷材料时&#xff0c;是否曾被成百上千份文档的页数统计折磨得焦头烂额&#xff1f;手动打开每个文件查看页数不仅效率低下&#xff0c;还容易出错。今天&#x…...

提升协作效率:KityMinder云同步功能全链路应用指南

提升协作效率&#xff1a;KityMinder云同步功能全链路应用指南 【免费下载链接】kityminder 百度脑图 项目地址: https://gitcode.com/gh_mirrors/ki/kityminder 思维导图云协作是现代团队知识管理与项目协作的核心需求。KityMinder作为百度推出的专业思维导图工具&…...

告别微信传文件!用LocalSend+cpolar搭建私人远程文件库(Windows保姆级教程)

打造私人云存储&#xff1a;LocalSend与cpolar的极简文件共享方案 你是否经历过这样的场景&#xff1a;在咖啡馆急需调取家里电脑的一份文档&#xff0c;却只能对着微信传输助手的"文件大小超过限制"提示干着急&#xff1f;或是出差在外&#xff0c;发现手机里缺少一…...

别让大模型只陪你聊天,用 RAG + Structured Extraction 终结合同盲区

音乐圈的版权大战从未停歇&#xff0c;从李荣浩早年关于“版权归属”的公开发声&#xff0c;到近期各路艺人与经纪公司的解约拉锯战&#xff0c;核心往往指向同一张纸——合同。 对于大多数人&#xff0c;无论是艺人、创作者还是创业者&#xff0c;合同是典型的“黑盒”。你签…...

如何让数学公式编辑达到手写速度:Obsidian LaTeX Suite深度解析

如何让数学公式编辑达到手写速度&#xff1a;Obsidian LaTeX Suite深度解析 【免费下载链接】obsidian-latex-suite Make typesetting LaTeX as fast as handwriting through snippets, text expansion, and editor enhancements 项目地址: https://gitcode.com/gh_mirrors/o…...

Guardrails未来版本路线图:10大新功能全面展望与AI安全演进

Guardrails未来版本路线图&#xff1a;10大新功能全面展望与AI安全演进 【免费下载链接】guardrails Adding guardrails to large language models. 项目地址: https://gitcode.com/gh_mirrors/gu/guardrails 在大型语言模型&#xff08;LLM&#xff09;应用日益普及的今…...

别只盯着ChatGPT了!SpringAI工具调用帮你低成本打造专属‘AI员工’(避坑指南)

别只盯着ChatGPT了&#xff01;SpringAI工具调用帮你低成本打造专属‘AI员工’&#xff08;避坑指南&#xff09; 想象一下&#xff0c;你的电商团队每天要处理上百条"库存还有吗&#xff1f;"、"订单能改地址吗&#xff1f;"这样的重复咨询。客服人力成本…...

手把手教你用Cloudflare免费RPC节点开发以太坊应用

从零构建以太坊DApp&#xff1a;Cloudflare免费RPC节点实战指南 当你在深夜调试智能合约时&#xff0c;是否曾被突然失效的RPC节点打断思路&#xff1f;作为以太坊开发者&#xff0c;稳定可靠的节点连接是开发流程中最基础却最容易被忽视的一环。Cloudflare提供的免费以太坊RPC…...

CMake构建类型避坑指南:为什么你的Release模式没有优化?CMAKE_BUILD_TYPE常见问题排查

CMake构建类型避坑指南&#xff1a;为什么你的Release模式没有优化&#xff1f; 在C项目开发中&#xff0c;构建类型的选择直接影响最终生成的可执行文件性能。许多开发者在使用CMake时都遇到过这样的困惑&#xff1a;明明设置了CMAKE_BUILD_TYPERelease&#xff0c;但生成的代…...

终极指南:Laravel DataTables 性能优化实战——不同场景下的表现对比

终极指南&#xff1a;Laravel DataTables 性能优化实战——不同场景下的表现对比 【免费下载链接】laravel-datatables jQuery DataTables API for Laravel 4|5|6|7|8|9|10 项目地址: https://gitcode.com/gh_mirrors/la/laravel-datatables Laravel DataTables 是一款强…...