Node.js cluster模块详解
Node.js cluster
模块详解
cluster
模块允许你轻松创建共享同一服务器端口的子进程(worker),充分利用多核 CPU 的性能。它是 Node.js 实现高并发的重要工具。
核心概念
- 主进程(Master):负责管理工作进程,通常不处理实际请求
- 工作进程(Worker):实际处理请求的子进程
- IPC 通信:主进程和工作进程之间通过进程间通信(IPC)交换消息
基本使用
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;if (cluster.isMaster) {console.log(`主进程 ${process.pid} 正在运行`);// 衍生工作进程for (let i = 0; i < numCPUs; i++) {cluster.fork();}cluster.on('exit', (worker, code, signal) => {console.log(`工作进程 ${worker.process.pid} 已退出`);});
} else {// 工作进程可以共享任何 TCP 连接// 在本例子中,它是一个 HTTP 服务器http.createServer((req, res) => {res.writeHead(200);res.end('你好世界\n');}).listen(8000);console.log(`工作进程 ${process.pid} 已启动`);
}
主要 API
cluster.isMaster / cluster.isWorker
cluster.isMaster
: 如果是主进程则为 truecluster.isWorker
: 如果是工作进程则为 true
cluster.fork([env])
- 衍生一个新的工作进程
- 可以传入环境变量对象
env
- 返回
Worker
对象
cluster.setupMaster([settings])
- 修改默认的
fork
行为 settings
可选参数:exec
: 工作进程文件路径args
: 传递给工作进程的参数silent
: 是否将输出发送到父进程的 stdio
cluster.worker
- 当前工作进程对象的引用(仅在子进程中可用)
cluster.workers
- 存储所有活跃工作进程的哈希表
- 键是工作进程 ID,值是
Worker
对象
Worker 类
worker.id
- 每个新创建的工作进程都有唯一的 ID
worker.process
- 工作进程的
ChildProcess
对象
worker.send(message[, sendHandle][, callback])
- 向工作进程发送消息
- 可以通过
sendHandle
发送句柄
worker.kill([signal=‘SIGTERM’])
- 杀死工作进程
worker.disconnect()
- 断开工作进程与主进程的连接
事件
cluster.on(‘fork’, worker)
- 当新的工作进程被 fork 时触发
cluster.on(‘online’, worker)
- 当工作进程开始运行后触发
cluster.on(‘listening’, worker, address)
- 当工作进程调用
listen()
后触发
cluster.on(‘disconnect’, worker)
- 当工作进程的 IPC 通道断开时触发
cluster.on(‘exit’, worker, code, signal)
- 当工作进程退出时触发
cluster.on(‘message’, worker, message, handle)
- 当工作进程发送消息时触发
高级特性
1. 进程间通信
if (cluster.isMaster) {const worker = cluster.fork();worker.send('主进程发送的消息');worker.on('message', (msg) => {console.log('收到工作进程消息:', msg);});
} else {process.on('message', (msg) => {console.log('收到主进程消息:', msg);process.send('工作进程回复');});
}
2. 优雅重启
if (cluster.isMaster) {// 启动工作进程const worker = cluster.fork();// 收到重启信号process.on('SIGUSR2', () => {const newWorker = cluster.fork();newWorker.on('listening', () => {worker.kill('SIGTERM');});});
} else {require('./server'); // 你的应用代码
}
3. 共享服务器端口
多个工作进程可以共享同一个端口:
if (cluster.isMaster) {for (let i = 0; i < numCPUs; i++) {cluster.fork();}
} else {const net = require('net');net.createServer((socket) => {socket.end('由工作进程 ' + process.pid + ' 处理');}).listen(8000);
}
性能注意事项
- 负载均衡:Node.js 的 cluster 模块默认使用轮询调度(除了 Windows)
- 状态共享:工作进程之间不共享内存,需要通过 IPC 或外部存储(如 Redis)共享状态
- 长连接:对于 WebSocket 等长连接应用,需要确保同一客户端始终连接到同一工作进程
实际应用示例
Express 应用集群化
const cluster = require('cluster');
const express = require('express');
const numCPUs = require('os').cpus().length;if (cluster.isMaster) {console.log(`主进程 ${process.pid} 正在运行`);// 衍生工作进程for (let i = 0; i < numCPUs; i++) {cluster.fork();}cluster.on('exit', (worker, code, signal) => {console.log(`工作进程 ${worker.process.pid} 已退出`);// 自动重启cluster.fork();});
} else {const app = express();app.get('/', (req, res) => {res.send(`由工作进程 ${process.pid} 处理`);});app.listen(3000, () => {console.log(`工作进程 ${process.pid} 已启动`);});
}
常见问题解决方案
- 工作进程崩溃:监听
exit
事件并自动重启 - 零停机部署:使用
SIGUSR2
信号实现优雅重启 - 会话保持:使用粘性会话(sticky session)或外部会话存储
总结
cluster
模块是 Node.js 实现多进程的核心模块,能够显著提升应用的并发处理能力。通过合理配置和管理工作进程,可以构建高可用、高性能的 Node.js 应用。
相关文章:
Node.js cluster模块详解
Node.js cluster 模块详解 cluster 模块允许你轻松创建共享同一服务器端口的子进程(worker),充分利用多核 CPU 的性能。它是 Node.js 实现高并发的重要工具。 核心概念 主进程(Master):负责管理工作进程…...
2025年认证杯数学建模C题完整分析论文(共39页)(含模型、可运行代码)
2025年认证杯数学建模竞赛C题完整分析论文 目录 摘要 一、问题重述 二、问题分析 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1解析 4.1.2问题1模型建立 4.1.3问题1求解代码 4.1.4问题1求解结果 4.2问题2 4.2.1问题2解析 4.2.2问题2模型建…...
PostgreSQL 的 COPY 命令
PostgreSQL 的 COPY 命令 PostgreSQL 的 COPY 命令是高效数据导入导出的核心工具,性能远超常规 INSERT 语句。以下是 COPY 命令的深度解析: 一 COPY 命令基础 1.1 基本语法对比 命令类型语法示例执行位置文件访问权限服务器端COPYCOPY table FROM /p…...
MySQL进阶-存储引擎索引
目录 一:存储引擎 MySQL体系结构 存储引擎介绍 存储引擎特点 InnoDB MyISAM Memory 区别及特点 存储引擎选择 索引 索引概述 介绍 演示 特点 索引结构 概述 二叉树 B-Tree BTree Hash 索引分类 索引分类 聚集索引&二级索引 一࿱…...
为什么需要Refresh Token?
后端服务性能 一种方案是在服务器端保存 Token 状态,用户每次操作都会自动刷新(推迟) Token 的过期时间——Session 就是采用这种策略来保持用户登录状态的。然而仍然存在这样一个问题,在前后端分离、单页 App 这些情况下&#x…...
基于3A4000及CentOS的银河麒麟V10离线源码编译安装VLC
碰到过的一个具体问题: 源码安装vlc-3.0.x版本,需要注意的是,不要安装ffmpeg-5及以上的版本,即只支持ffmpeg-4的版本,因此,要安装vlc-3.0版本,一个重要的依赖时就会ffmpeg-4。报错没有revision…...
Windows for Redis 后台服务运行
下载 redis 安装包 地址:https://github.com/tporadowski/redis/releases 解压zip压缩包,执行 redis-server.exe 即可以窗口模式运行(窗口关闭则服务关闭) 运行窗口可以看到,端口是 6379 我这里使用 nvaicat 客服端测…...
前端工程化-包管理NPM-package.json 和 package-lock.json 详解
package.json 和 package-lock.json 详解 1.package.json 基本概念 package.json 是 Node.js 项目的核心配置文件,它定义了项目的基本信息、依赖项、脚本命令等。 主要字段 基本信息字段 name: 项目名称(必填) version: 项目版本…...
如何在 Linux 中彻底终止被 `Ctrl+Z` 挂起的进程?
问题场景 在 Linux 终端操作时,你是否曾遇到过这样的情况? 当运行一个命令(如 ping www.baidu.com)时,不小心按下了 CtrlZ,屏幕上显示类似以下内容: ^Z [2] 已停止 ping www.b…...
人工智能100问☞第3问:深度学习的核心原理是什么?
目录 一、通俗解释 二、专业解析 三、权威参考 深度学习的核心原理是通过构建多层神经网络结构,逐层自动提取并组合数据特征,利用反向传播算法优化参数,从而实现对复杂数据的高层次抽象和精准预测。 一、通俗解释 深度学习的核心原理,就像是教计算机像婴儿…...
基于若依和elementui实现文件上传(导入Excel表)
基于若依和elementui实现文件上传(导入Excel表) 前端部分: 若依封装了Apache的poi功能,实现文件的上传和下载 若依使用的是JS语法,需要改造为JS语法才能使用 若依如何解决跨域的问题: 在前端的配置文件中…...
2025年第十六届蓝桥杯省赛真题解析 Java B组(简单经验分享)
之前一年拿了国二后,基本就没刷过题了,实力掉了好多,这次参赛只是为了学校的加分水水而已,希望能拿个省三吧 >_< 目录 1. 逃离高塔思路代码 2. 消失的蓝宝思路代码 3. 电池分组思路代码 4. 魔法科考试思路代码 5. 爆破思路…...
OpenHarmony人才认证证书
OpenHarmony人才认证体系目前支持初级工程师认证,要求了解OpenHarmony开源项目、生态进展及系统移植等基础知识,熟练掌握OpenHarmony的ArkUI、分布式软总线、分布式硬件、分布式数据管理等基础能力使用,具备基础的开发能力。 考试流程可参考O…...
Docker--利用dockerfile搭建mysql主从集群和redis集群
Docker镜像制作的命令 链接 Docker 镜像制作的注意事项 链接 搭建mysql主从集群 mysql主从同步的原理 MySQL主从同步(Replication)是一种实现数据冗余和高可用性的技术,通过将主数据库(Master)的变更操作同步到一个…...
LLaMA-Factory双卡4090微调DeepSeek-R1-Distill-Qwen-14B医学领域
unsloth单卡4090微调DeepSeek-R1-Distill-Qwen-14B医学领域后,跑通一下多卡微调。 1,准备2卡RTX 4090 2,准备数据集 医学领域 pip install -U huggingface_hub export HF_ENDPOINThttps://hf-mirror.com huggingface-cli download --resum…...
使用ZSH美化Windows系统Git Bash
此前,我们讲解了一种借助 Windows Subsystem for Linux(WSL)让用户在 Windows 操作系统中运用 Linux Shell 命令,进而高效地实现文件访问、编译等开发工作。 Windows系统命令行的最佳实践 | 听到微笑的博客 这种借助 Windows Su…...
如何使用PyCharm自动化测试
如何使用PyCharm自动化测试 1.打开PyCharm右击文件,点击新建项目 按照如图配置,然后点击创建 2.创建好后,点击文件,然后点击设置 按照如图步骤,查看selenium和webdriver-manager是否存在 3.以上都完成后按照如图创…...
56.评论日记
2025年4月12日22:06:08 小米事故下的众生相_哔哩哔哩_bilibili...
EMI滤波器和ESD保护等效参数汇总
EMI 共模抑制与ESD设计参考用,特别是工业和机器人,伺服器类产品,特别关注,提高产品稳定性 基带接口 通道数 线性小信号等效参数 数字端口时钟频率 备注 Rline Cline 电池反接 1 — 240Pf — 过压和电池反接保护 …...
java -jar与java -cp的区别
java -jar与java -cp 1、情景描述2、情景分析3、两者区别 通常情况下,我们会看到以下两种命令启动的Java程序: java -jar xxx.jar [args] java -cp xxx.jar mainclass [args]这两种用法有什么区别呢? 1、情景描述 1)Java打包单个…...
蓝桥杯嵌入式十五届模拟三(串口、双ADC)
一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹&#…...
04-算法打卡-数组-二分查找-leetcode(69)-第四天
1 题目地址 69. x 的平方根 - 力扣(LeetCode)69. x 的平方根 - 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。注意:不允许使用任何内…...
SpringBoot项目:部门管理系统
文章目录 1、工程搭建1.1 创建项目1.2 创建数据库1.3 准备基础代码1.4 准备mapper接口1.5 准备service层1.6 准备controller层2、接口开发2.1 查询部门2.1.1 接口开发1、工程搭建 1.1 创建项目 主要内容: 创建Springboot工程引入web开发起步依赖、mybatis、mysql驱动、lombok…...
MyBatis-Plus 扩展功能
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 逻辑删除一、配置逻辑删除字段方式一:全局配置(推荐)方式二:实体类注解配置 二、逻辑删除流程三、完整代码示例1. 实…...
service和endpoints是如何关联的?
在Kubernetes中,Service 和 Endpoints 是两个密切关联的对象,它们共同实现了服务发现和负载均衡的功能。以下是它们之间的关联和工作原理: 1. Service 的定义 Service 是一种抽象,定义了一组逻辑上相关的 Pod,以及用…...
MyBatis-plus 快速入门
提示:MyBatis-Plus(MP)是一个 MyBatis的增强版 文章目录 前言使用MybatisPlus的基本步骤1、引入MybatisPlus依赖代替Mybatis依赖2、定义Mapper接口并继承BaseMapper他是怎么知道哪张表,哪些字段呢 3、实体类注解4、根据需要添加配…...
【PySpark大数据分析概述】03 PySpark大数据分析
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PySpark大数据分析与应用 ⌋ ⌋ ⌋ PySpark作为Apache Spark的Python API,融合Python易用性与Spark分布式计算能力,专为大规模数据处理设计。支持批处理、流计算、机器学习 (MLlib) 和图计算 (GraphX)&am…...
C# --- IEnumerable 和 IEnumerator
C# --- IEnumerable 和 IEnumerator IEnumerableIEnumeratorIEnumerable 和 IEnumerator 的作用手动实现 IEnumerableIEnumerable vs. IQueryable为什么有了ienumerator还需要ienumerable IEnumerable 在C#中,IEnumerable 是一个核心接口,用于表示一个可…...
Excel VBA 运行时错误1004’:方法‘Open’作用于对象‘Workbooks’时失败 的解决方法
使用Excel编写VBA脚本时出现如下错误: 运行时错误1004’: 方法‘Open’作用于对象‘Workbooks’时失败 我的功能是打开一系列excel文件从中自动复制数据到汇总excel的各个指定的sheet中,来源的excel是从网站上下载的。 出现这个问题后从网上查找各种办…...
03-算法打卡-数组-二分查找-leetcode(34)-第三天
1 题目地址 34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)34. 在排序数组中查找元素的第一个和最后一个位置 - 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置…...
利用python从零实现Byte Pair Encoding(BPE)
喜欢可以到我的主页订阅专栏哟(^U^)ノ~YO 第一章:自然语言处理与分词技术基础 1.1 自然语言处理的核心挑战 自然语言处理(Natural Language Processing, NLP)作为人工智能领域的重要分支,其核心目标是实现计算机对人类语言的理解与生成。在深度学习技术快速发展的今…...
Redis的分布式锁
Redis的分布式锁 一.分布式锁的简介二.分布式锁的实现1.基本实现2.引入过期时间3.引入校验ID4.引入Lua5.引入看门狗(watch dog)6.引入RedLock算法 一.分布式锁的简介 在一个分布式的系统中, 会涉及到多个节点访问一个公共资源的情况,此时就需要通过锁的…...
SpringBoot分布式项目中实现智能邮件提醒系统
一、应用场景与需求分析 在电商、OA、客服等系统中,邮件提醒是用户触达的重要方式。本文针对以下典型需求进行方案设计: 多类型支持:订单超时、服务到期、待办通知等场景动态内容:支持纯文本/HTML/模板引擎内容格式智能重发:24小时未处理自动升级提醒级别高可用性:分布式…...
LSTM-SVM长短期记忆神经网络结合支持向量机组合模型多特征分类预测/故障诊断,适合新手小白研究学习(Matlab完整源码和数据)
LSTM-SVM长短期记忆神经网络结合支持向量机组合模型多特征分类预测/故障诊断,适合新手小白研究学习(Matlab完整源码和数据) 目录 LSTM-SVM长短期记忆神经网络结合支持向量机组合模型多特征分类预测/故障诊断,适合新手小白研究学习…...
【图像处理基石】什么是抗锯齿(Anti-Aliasing)?
1. 抗锯齿的定义与作用 抗锯齿(Anti-Aliasing, AA)是一种用于消除数字图像中因采样不足导致的边缘锯齿现象的技术。锯齿(Jaggies)通常出现在高分辨率信号以低分辨率呈现时,例如3D图形渲染或图像缩放过程中。抗锯齿通过…...
C++曲线数据统一:如何高效插值并处理多条曲线的x值
在数据处理和科学计算中,我们经常会遇到需要对多条曲线进行统一x值处理的情况。例如,在实验数据记录中,不同传感器可能以不同的采样率记录数据,导致曲线的x值不一致。为了后续的分析和可视化,我们需要将这些曲线的x值统…...
训练模型的方式的两种方式:图像描述(Image Captioning)和对比学习(Contrastive Learning)原理及区别
图像描述(Image Captioning)和对比学习(Contrastive Learning)都是深度学习中用于训练模型的方式,但它们的目标、原理和实现方法都有很大不同。让我们分别看看它们的原理和区别。 1. 图像描述(Image Capti…...
数据结构:哈希表 | C++中的set与map
上回说到,红黑树是提升了动态数据集中频繁插入或删除操作的性能。而哈希表(Hash Table),则是解决了传统数组或链表查找数据必须要遍历的缺点。 哈希表 哈希表的特点就是能够让数据通过哈希函数存到表中,哈希函数能够将数据处理为表中位置的索…...
【unity游戏开发——Animator动画】Animator动画状态机复用——重写动画控制器 Animator Override Controller
注意:考虑到UGUI的内容比较多,我将UGUI的内容分开,并全部整合放在【unity游戏开发——Animator动画】专栏里,感兴趣的小伙伴可以前往逐一查看学习。 文章目录 一、状态机复用是什么?二、实战专栏推荐完结 一、状态机复…...
第九届 蓝桥杯 嵌入式 省赛
一、分析 1. LCD 显示 显示 存储位置、定时时间和当前状态存储位置:5个,来存储定时时间当前状态 定时器停止,Standby设置时间,Setting定时器运行,Runing定时器暂停,Pause 伪代码 LCD 显示 # 显示存储位…...
电流互感器的两相星形接线的建模与仿真
微♥“电击小子程高兴的MATLAB小屋”获取巨额优惠 1.模型简介 本仿真模型基于MATLAB/Simulink(版本MATLAB 2016Rb)软件。建议采用matlab2016 Rb及以上版本打开。(若需要其他版本可联系代为转换) 2.仿真模型 3.仿真结果 3.1一次…...
【征程 6】工具链 VP 示例中 Cmakelists 解读
1. 引言 在文章【征程 6】VP 简介与单算子实操中,介绍了 VP 是什么,并以单算子 rotate 为例,介绍了 VP API 使用方法。在【征程 6】工具链 VP 示例中日志打印解读 中介绍了 VP 单算子示例中用到的日志打印的头文件应该怎么写。接下来和大家一…...
制作像素风《饥荒》类游戏的整体蓝图和流程
游戏的制作过程和核心要素拆解成以下几个主要部分: 1. 核心概念与玩法设计 (蓝图构思) 游戏类型: 确定是纯粹的生存、带有冒险元素,还是有其他侧重?(比如更强的战斗、建造或剧情)核心循环: 玩家主要做什么࿱…...
Day22 -php开发01--留言板+知识点(超全局变量 文件包含 数据库操作 第三方插件)
环境要求:php7.0.9 小皮 navicat phpstorm24.1 知识点:会写(留言板 留言板后台) 超全局变量 三方插件的使用 文件包含 1、开启小皮并利用navicat新建一个数据库 注意:本地的服务mysql关闭后 才可打开小皮。属…...
履带小车+六轴机械臂(1)
基于单片机的可移动抓取机械手 采用的是一个履带底盘和六轴机械臂做的 已经实现的功能有:PS2手柄控制六个轴的舵机转动和控制两个直流减速电机的转动,以此来达到控制移动和抓取的目地,以及用手机APP连接蓝牙模块HC-05也能达到六个轴的舵机转…...
AI:深度学习之循环神经网络(RNN)
🔄 从零入门循环神经网络(RNN):原理详解+代码实战+未来展望 🚀 摘要:在人工智能蓬勃发展的当下,循环神经网络(Recurrent Neural Network, RNN)是处理序列数据的“记忆大师”🧠,正发挥着举足轻重的作用。从自然语言处理中的文本生成、机器翻译,到语音识别、时间…...
03-libVLC的视频播放器:控制(播放/暂停/停止/拖动条/声音)
libvlc_media_player_get_state(m_pMediaPlayer) 功能:获取当前媒体播放器的状态,返回值为libvlc_state_t枚举类型。常见状态值:libvlc_Playing:正在播放libvlc_Paused:已暂停libvlc_Stopped:已停止libvlc_Ended:播放结束libvlc_Error:发生错误注意事项:状态检测是异步…...
Python_仓库使用货拉拉物流运费计算1
仓库地址为广州 物料表里有各SKU的尺寸,长宽高 货拉拉收费明细表 根据订单的SKU的数量、尺寸、重量,去寻找最合适的货拉拉车型,并计算它所需的路费 import pandas as pd# 读取数据 df_111 pd.read_excel(订单明细表.xlsx) df_material …...
CATIA高效工作指南——常规配置篇(一)
一、CATIA无窗口启动优化 原理与实现 通过修改环境变量或启动参数,可禁用启动界面以提升加载速度。添加环境变量CATNOSTARTDOCUMENT1可跳过初始画面 进阶应用: 结合脚本实现静默启动:创建批处理文件(.bat)包含start …...
【AI提示词】金融信息抽取工程师工作流程
提示说明 专注于从金融行业的文本中提取关键信息,确保准确性和规范性。具备良好的文本处理能力和数据整理经验,能够处理复杂的信息结构。 提示词 # Role:金融信息抽取工程师## Background: 用户希望从金融行业的文本中严格提取…...