重学nodejs系列之cluster & worker_threads(七)

前言

在 Node.js 中,实现多进程和多线程是提高应用性能的常见手段。Cluster 模块和 Worker Threads 提供了在 Node.js 中进行多进程和多线程编程的解决方案。本文将深入介绍这两个模块的使用方法、优势以及在实际项目中的应用场景。

1. Cluster 模块

1.1 什么是 Cluster

Cluster 模块是 Node.js 的核心模块之一,用于创建多进程应用,通过主进程(Master)和工作进程(Worker)的协同工作,实现负载均衡和提高应用的稳定性。

1.2 使用 Cluster

使用 Cluster 模块非常简单,只需要在主模块中引入 cluster,然后在主进程中创建工作进程。

ts 复制代码
// 主模块(master.ts)
import cluster from "cluster";
import os from "os";

if (cluster.isPrimary) {
  // 主进程代码
  console.log(`主进程 ${process.pid} 正在运行`);

  // 衍生工作进程
  for (let i = 0; i < os.cpus().length; i++) {
    cluster.fork();
  }

  // 监听工作进程退出事件
  cluster.on("exit", (worker, code, signal) => {
    console.log(`工作进程 ${worker.process.pid} 已退出,退出码 ${code}`);
  });
} else {
  // 工作进程代码
  console.log(`工作进程 ${process.pid} 启动`);

  // 模拟工作进程执行任务
  setTimeout(() => {
    console.log(`工作进程 ${process.pid} 完成任务`);
    process.exit(0);
  }, 5000);
}

在上述代码中,主模块首先检查当前进程是否为主进程,如果是主进程则创建多个工作进程,每个工作进程模拟执行一个任务。当工作进程完成任务后,它会退出,主进程会监听工作进程的退出事件。

1.3 Cluster 的优势

  • 提高性能: 多进程模型充分利用多核 CPU,提高应用性能。
  • 提高稳定性: 单个工作进程的崩溃不会影响其他工作进程,提高应用的稳定性。
  • 负载均衡: Cluster 模块可以自动分配请求到不同的工作进程,实现负载均衡。

2. Worker Threads 模块

2.1 什么是 Worker Threads

Worker Threads 是 Node.js 提供的一种创建多线程的解决方案,通过创建多个线程并使其共享同一份内存,实现并行执行任务。

2.2 使用 Worker Threads

使用 Worker Threads 需要引入 worker_threads 模块,然后创建并启动工作线程。

ts 复制代码
// 主模块(main.ts)
import { Worker } from 'worker_threads';

// 创建工作线程
const worker = new Worker(`
  const { parentPort } = require('worker_threads');
  parentPort.postMessage('Hello from Worker Thread');
`, { eval: true });

// 监听工作线程的消息事件
worker.on('message', (message) => {
  console.log(`主线程收到消息:${message}`);
  // 主线程收到消息:Hello from Worker Thread
});

在上述代码中,主模块创建了一个工作线程,工作线程执行一段简单的 JavaScript 代码,并通过 parentPort.postMessage 发送消息给主线程。主线程监听工作线程的消息事件,并在收到消息时输出。

2.3 Worker Threads 的优势

  • 利用多核 CPU: 允许并行执行任务,充分利用多核 CPU。
  • 共享内存: 工作线程之间可以共享同一份内存,避免复杂的进程间通信。

3. 总结

Cluster 模块和 Worker Threads 提供了在 Node.js 中实现多进程和多线程的解决方案。选择合适的模块取决于应用场景和需求。Cluster 模块适用于多进程模型,可提高性能和稳定性;Worker Threads 则适用于多线程模型,充分利用多核 CPU,并实现共享内存。在实际应用中,根据具体情况灵活选择,可以通过组合使用这两个模块来更好地提升 Node.js 应用的性能。

相关推荐
用户2788607285672 分钟前
别把 AI 查询结果只塞进聊天框:SessionView 与业务页面接线
前端
程序员鱼皮3 分钟前
Personal Agent 是什么?为什么大厂都抢着做?连 DeepSeek Bot 都来了。。
前端·后端·ai编程
m0_5873830011 分钟前
碰碰好评卡功能落地全流程实战指南 附核心逻辑与常见问题解决方案
java·前端·数据库·后端·struts·需求分析
子轩学长说12 分钟前
Workbuddy独立文件浏览器新上线,彻底告别WPS和office全家桶~
前端
nyaomaru13 分钟前
如何用 Jev 从 PR 中提取 “Why” 并写入 CHANGELOG?🤔
前端·typescript
Shirley~~13 分钟前
从0搭建一个3D立体场景:光影与交互全解析
前端·3d
Dovis(誓平步青云)14 分钟前
一年1956亿行:智能电表场景下的时序数据存储实践
运维·前端·自动化·音视频·prometheus
兰亭妙微UI设计公司14 分钟前
兰亭妙微分享:高手设计登录页的12种切入点
开发语言·前端·javascript
前端Baymax18 分钟前
静默的 86 小时:全链 402 停摆与零告警的故障复盘
开发语言·前端·javascript
要开心吖ZSH20 分钟前
定时任务从外部调度搬回本地 @Scheduled:一次连接池被打满的复盘与选型思考
前端·firefox