Node.js 中 worker threads 和 clusters 的区别

2025年2月21日 | 阅读 4 分钟

在本文中,我们将讨论 Node.js 中 Worker ThreadsClusters 之间的区别。但在讨论它们的区别之前,我们必须先了解 Node.js 中 Worker Threads 和 Clusters 的概念以及它们的示例。

什么是 Node.JS 中的 Worker Thread?

Worker Thread 模块是由 Node.js 开发的,用于克服单线程执行的局限性。该模块允许具有事件循环的并行线程(worker threads)并发执行 JavaScript 代码。通过 worker threads 将 CPU 密集型任务从主线程卸载,可以提高性能和响应能力。

示例

让我们举一个例子来说明 Node.js 中的 Worker Thread

输出

 
Received message from main thread: Hello, worker!
Received a message from the worker: Worker processed: Hello, worker!   

说明

在此示例中,Node.js 中的 worker_threads 模块用于生成一个 worker thread 进行并行处理。首先,脚本使用 isMainThread 来确定它是在主线程上运行。如果是,则使用当前脚本文件 (__filename) 创建一个 worker thread。一旦主线程设置了接收来自 worker 的消息的监听器,它就会发送第一条消息“Hello, worker!”。worker thread 上的 parentPort 事件监听器接收并处理来自主线程的消息。worker 接收消息,记录它,处理它,然后添加“Worker processed:”并将结果返回给主线程。这可以防止 worker 线程和主线程之间的执行阻塞,并实现它们之间的有效通信。

什么是 Node.JS 中的 Clusters?

Node.js clusters 通过创建共享服务器端口的工作进程,使应用程序能够在多个核心上并发运行,从而充分利用系统的资源。由于 Node.js 应用程序本质上是单线程的,因此可以将负载分布到多个进程上,从而提高性能和可伸缩性。

示例

让我们举一个例子来说明 Node.js 中的 Clusters

输出

 
Master 18 is running
Worker 25 started
Worker 26 started   

说明

这段 Node.js 代码构建了一个基本的 cluster,以充分利用多核系统。主进程(由 cluster.isMaster 确定)会 fork 与 CPU 核心数 (os.cpus().length) 相等的子进程。每个子进程在运行监听端口 8000 的 HTTP 服务器时,会发送“Hello World”响应。主进程会监听子进程的退出事件,并在子进程意外终止时重新启动它们,以确保服务的持续运行。通过将传入的请求分发到多个子进程,这种配置提高了应用程序的可伸缩性和性能。

Node.js 中 Worker Threads 和 Clusters 的主要区别

Difference between worker threads and clusters in Node.js

下表概述了 Node.js 中 worker threads 和 clusters 的主要区别,包括它们的用例、实现细节、通信方式、内存管理、性能特征、可伸缩性以及每个的示例场景。

特性Worker Threads
目的并行执行 CPU 密集型任务。在多个进程之间分配工作负载。
实施它最早在 Node.js v10.5.0 中引入,允许 JavaScript 代码在单个进程内的多个线程上运行。cluster 模块创建多个 Node.js 进程,每个进程运行在不同的 CPU 核心上。
用例CPU 密集型任务,如复杂的计算。提高可伸缩性并处理繁重负载。
执行上下文具有多个线程的单个进程。多个进程
内存共享使用 "SharedArrayBuffer" 共享内存。每个进程应拥有自己的内存区域。
沟通使用 "PostMessage" 进行消息传递。进程间通信 (IPC)。
性能开销由于内存共享,开销较小。由于进程分离,开销较大。
用例复杂的计算和数据处理。负载均衡和高流量的 Web 服务器。
可扩展性CPU 核心之间的可伸缩性有限。充分利用多核系统。
示例并行计算任务。处理多个请求的 Web 服务器。

结论

总而言之,worker threads 和 clusters 是 Node.js 的重要功能。我们可以根据我们的需求来使用它们。这两个功能都有其优点、局限性、用例和示例。