【Node】Node.js 多进程与多线程:Cluster 与 Worker Threads 入门

作者:你的人类朋友日期:2025/10/6

前言

在 Node.js 开发中,处理 CPU 密集型任务和提升应用性能是常见需求。

今天我们来深入理解 Node.js 提供的两种并发处理方案:Cluster 模块和 Worker Threads 模块。

☺️ 这边要求阅读本文的新手小伙伴要有一个印象:【Cluster】 与【进程】相关,【Worker Threads】 与【线程】相关

小贴士 📚:

✨Cluster 的中文意思是集群 ✨Worker Threads 的中文意思是工作线程

官方定义解析

Node.js 官方文档指出:

"Node.js 进程的集群可用于运行多个 Node.js 实例,这些实例可以在其应用程序线程之间分配工作负载。当不需要进程隔离时,请改用 worker_threads 模块,它允许在单个 Node.js 实例中运行多个应用程序线程。"

核心概念解释

进程(Process)

  • 拥有【独立内存空间】的程序实例
  • 相当于一个独立的应用程序
  • 进程间相互隔离,一个崩溃不会影响其他进程

线程(Thread)

  • 进程内的执行单元
  • 共享进程的内存空间
  • 线程间可以更高效地通信

两种方案的对比

Cluster 模块(多进程)

1const cluster = require('cluster')
2const os = require('os')
3
4if (cluster.isPrimary) {
5    // 主进程:创建工作进程
6    for (let i = 0; i < os.cpus().length; i++) {
7        cluster.fork()
8    }
9} else {
10    // 工作进程:启动服务器
11    require('./server.js')
12}
13

适用场景

  • HTTP 服务器负载均衡
  • 需要高隔离性的任务
  • 利用多核 CPU 处理并发请求

特点

  • ✅ 进程隔离,稳定性高
  • ✅ 充分利用多核 CPU
  • ❌ 内存开销较大
  • ❌ 进程间通信成本较高

Worker Threads 模块(多线程)

1const {Worker} = require('worker_threads')
2
3function runWorker(data) {
4    return new Promise((resolve, reject) => {
5        const worker = new Worker(
6            `
7      const { parentPort } = require('worker_threads');
8      parentPort.on('message', (data) => {
9        // 执行计算密集型任务
10        const result = heavyCalculation(data);
11        parentPort.postMessage(result);
12      });
13    `,
14            {eval: true}
15        )
16
17        worker.on('message', resolve)
18        worker.on('error', reject)
19        worker.postMessage(data)
20    })
21}
22

适用场景

  • CPU 密集型计算任务
  • 图像/视频处理
  • 大数据分析
  • 加密解密操作

特点

  • ✅ 内存共享,开销较小
  • ✅ 线程间通信高效
  • ❌ 隔离性较差,一个线程崩溃可能影响整个进程
  • ❌ 需要处理线程同步问题

选择指南

什么时候用 Cluster?

  • 构建 Web 服务器,需要处理大量并发连接。其实可以联想到 pm2 的多进程模式 —— 经过了解,得知 PM2 的集群模式(pm2 start app.js -i 4)在底层正是使用了 Node.js 的 Cluster 模块 来实现的。
  • 任务需要高度的稳定性和隔离性
  • 希望充分利用多核 CPU 性能

什么时候用 Worker Threads?

  • 需要执行复杂的数学计算或数据处理
  • 任务需要共享大量数据
  • 希望减少内存开销
  • 在单个进程中需要并行处理多个任务

实际应用示例

场景:图像处理服务

1// 使用 Worker Threads 处理图像
2const {Worker} = require('worker_threads')
3
4class ImageProcessor {
5    async processImages(images) {
6        const workers = images.map(image => this.createWorker('./image-worker.js', image))
7
8        const results = await Promise.all(workers)
9        return results
10    }
11
12    createWorker(workerPath, data) {
13        return new Promise((resolve, reject) => {
14            const worker = new Worker(workerPath, {workerData: data})
15            worker.on('message', resolve)
16            worker.on('error', reject)
17        })
18    }
19}
20

场景:高并发 Web 服务

1// 使用 Cluster 创建 Web 服务器集群
2const cluster = require('cluster')
3const http = require('http')
4const numCPUs = require('os').cpus().length
5
6if (cluster.isPrimary) {
7    console.log(`主进程 ${process.pid} 正在运行`)
8
9    // 衍生工作进程
10    for (let i = 0; i < numCPUs; i++) {
11        cluster.fork()
12    }
13
14    cluster.on('exit', (worker, code, signal) => {
15        console.log(`工作进程 ${worker.process.pid} 已退出`)
16    })
17} else {
18    // 工作进程共享同一个端口
19    http.createServer((req, res) => {
20        res.writeHead(200)
21        res.end('你好世界\n')
22    }).listen(8000)
23
24    console.log(`工作进程 ${process.pid} 已启动`)
25}
26

性能考量

  1. 内存使用:Worker Threads 通常比 Cluster 更节省内存
  2. 启动速度:线程启动比进程启动更快
  3. 通信成本:线程间通信比进程间通信更高效
  4. 稳定性:Cluster 提供更好的故障隔离

总结

这边简单做个总结 🍃

  • Cluster 适合需要高隔离性和稳定性的 I/O 密集型任务
  • Worker Threads 适合需要高效内存使用的 CPU 密集型任务

【Node】Node.js 多进程与多线程:Cluster 与 Worker Threads 入门》 是转载文章,点击查看原文


相关推荐


【Linux系统】快速入门一些常用的基础指令
落羽的落羽2025/10/5

各位大佬好,我是落羽!一个坚持不断学习进步的学生。 如果您觉得我的文章还不错,欢迎多多互三分享交流,一起学习进步! 也欢迎关注我的blog主页: 落羽的落羽 文章目录 pwd、whoami、clearmkdir、touch、treecdlsrmdir、rmmanechocat、tac、more、less、head、tailcp、mvfind、which、whereisaliasgrepzip、unzip、taruname 开始学习使用Linux,我们首先要掌握一些Linux


快速搭建redis环境并使用redis客户端进行连接测试
你的人类朋友2025/10/4

前言 最近工作要用到 redis,所以这边简要记录一下自己搭建 redis 环境的过程,后面忘记了回头看比较方便。 正文 一、环境安装 这边推荐个跨 windows 和 mac 的 redis 客户端,another Redis Desktop Manager windows 一般安装Another-Redis-Desktop-Manager-win-1.7.1-x64.exe mac 一般安装Another-Redis-Desktop-Manager-mac-1.7.1-arm64.dmg 具


Java 设计模式在 Spring 框架中的实践:工厂模式与单例模式
武昌库里写JAVA2025/10/2

# Java 设计模式在 Spring 框架中的实践:工厂模式与单例模式 概述 在软件开发中,设计模式是为了解决特定问题的最佳实践经验的总结。而工厂模式和单例模式是其中两个最为常用和重要的设计模式,在 Java 开发中得到了广泛应用。在 Spring 框架中,工厂模式和单例模式也有着非常重要的应用。本文将从实际的案例出发,介绍工厂模式和单例模式在 Spring 框架中的实践。 工厂模式在 Spring 框架中的实践 工厂模式简介 工厂模式是一种创


如何用 CSS 中写出超级美丽的阴影效果
非优秀程序员2025/10/2

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」。 在我看来,最好的网站和Web应用程序对它们具有切实的"真实"质量。实现这种质量涉及很多因素,但阴影是一个关键因素。 然而,当我环顾网络时,很明显,大多数阴影并不像它们所希望的那样丰富。网络上覆盖着模糊的灰色盒子,看起来并不像影子。 在本教程中,我们将学习如何将典型的箱形阴影转换为美丽、逼真的阴影: 为什么还要使用阴影? 我保证,我们很快就会谈到有趣的CSS技巧。但首先,我想退后一步,谈谈为什么阴影存在于CSS中,以


Xrdp 远程桌面配置【笔记】
AnsonNie2025/10/2

Xrdp 远程桌面配置 Xrdp 是一个开源的 远程桌面协议(RDP)服务器。 核心功能:它允许您使用来自其他计算机的图形化桌面连接到运行它的 Linux 服务器。工作原理:它在 Linux 系统上创建一个 RDP 服务端。您可以从任何兼容 RDP 的客户端(如 Windows 自带的“远程桌面连接”、macOS 的 Microsoft Remote Desktop、Linux 的 Remmina 等)进行连接。底层技术:通常,Xrdp 本身并不直接提供桌面环境,而是与现有的 X Windo


starrocks查询伪代码
syty202010/1/2025

尽可能下推到存储层,在扫描时利用索引 (前缀索引、Bloom Filter、位图索引、ZoneMap) 提前过滤掉大量无关数据块,减少 I/O 和 CPU 处理量。​,实现了极致的查询性能。它将数据处理任务分解成高效的、针对现代硬件优化的批处理操作流,最大限度地榨干了 CPU 和 I/O 的性能。​ 在列数据上执行紧凑的循环,最大化 CPU 缓存利用率。​ 只读查询需要的列,利用列存格式的压缩和编码优势。​ (数据流驱动,最小化等待) 两大核心技术,结合​。​ (所有算子处理 Batch) 和 ​。


Midscene.js为什么能通过大语言模型成功定位页面元素
测试者家园9/30/2025

Midscene.js 能通过大语言模型成功定位页面元素并生成 XPath 这类路径,核心在于其多模态模型对网页视觉和语义信息的深度理解,从而实现了所见即所操作的能力。它改变了传统自动化测试严重依赖脆弱定位器的状况,用更高层的意图描述替代了底层的实现细节,在提升脚本稳定性和降低使用门槛方面是一次重要的创新。


一文读懂 Vue 组件间通信机制(含 Vue2 / Vue3 区别)
excel2025/10/8

一、组件间通信的概念 在 Vue 中,组件(Component) 是最核心的概念之一。每个 .vue 文件都可以视为一个独立的组件。 而 通信(Communication) 是指一个组件如何将信息传递给另一个组件。 通俗地说: 组件间通信,就是不同组件之间如何共享数据、触发行为、进行信息交互的过程。 例如:当我们使用 UI 框架中的 table 组件时,需要向它传入 data 数据,这个“传值”的过程本质上就是一种组件通信。 二、组件间通信解决了什么问题? 在实际开发中,每个组件都有自己的


【机器学习】无监督学习 —— K-Means 聚类、DBSCAN 聚类
一杯水果茶!2025/10/9

K-Means 聚类标准 K-Means 算法K-Means 评估:肘部法则(Elbow Method)与轮廓系数(Silhouette Score)1. 肘部法则(Elbow Method)2. 轮廓系数(Silhouette Score) DBSCAN 聚类(Density-Based Spatial Clustering of Applications with Noise)DBSCAN 的关键参数DBSCAN 算法 K-Means 聚类 K‑Means 聚类 是一种


零基础学JavaScript:手把手带你搭建环境,写出第一个程序!
良山有风来2025/10/11

开头:你是不是也遇到过这些问题? 刚学JavaScript的时候,你是不是一脸懵? 打开教程,满屏的“Node.js”、“npm”、“VS Code”,完全不知道从哪下手? 照着网上的教程配置环境,结果各种报错,心态爆炸? 写了半天代码,连个“Hello World”都显示不出来? 别担心!这篇文章就是为你准备的。 我会用最直白的方式,带你一步步搭建JavaScript开发环境,并写出你的第一个程序。 看完这篇文章,你不仅能顺利运行第一个JavaScript程序,还能理解背后的原理,为后续学习打

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0