Nodejs如何利用多核CPU性能

Nodejs如何利用多核CPU性能

一个 node程序中监听2个独立的express 1.png

2个node程序独立监听各自的express 2.png 想利用多核cpu ,只能用第二种方法吗?

5 回复

要在 Node.js 中充分利用多核 CPU 的性能,可以使用多种方法。其中一种常用的方法是使用 cluster 模块,它允许你在一个进程中创建多个工作进程(每个工作进程都会占用一个 CPU 核心)。这些工作进程可以处理不同的请求,从而提高应用的并发处理能力。

示例代码

以下是一个简单的例子,展示如何使用 cluster 模块来利用多核 CPU:

const express = require('express');
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;

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

    // 创建与 CPU 数量相同的子进程
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }

    // 监听所有子进程的退出事件
    cluster.on('exit', (worker, code, signal) => {
        console.log(`工作进程 ${worker.process.pid} 已终止`);
    });
} else {
    // 子进程启动后执行的代码
    const app = express();

    app.get('/', (req, res) => {
        res.send('Hello World!');
    });

    const PORT = process.env.PORT || 3000;
    app.listen(PORT, () => {
        console.log(`工作进程 ${process.pid} 正在监听端口 ${PORT}`);
    });
}

解释

  1. 检查是否为主进程

    • 使用 cluster.isMaster 来判断当前进程是否为 master 进程。
    • 如果是主进程,则会创建与 CPU 核心数量相等的工作进程。
  2. 创建子进程

    • 使用 cluster.fork() 方法来创建子进程。这里我们根据 CPU 核心数量创建相应数量的子进程。
  3. 监听子进程退出事件

    • 通过 cluster.on('exit', ...) 方法来监听子进程退出事件,并打印相应的日志信息。
  4. 子进程逻辑

    • 子进程会启动一个 Express 应用,并监听指定的端口。
    • 这样,每个子进程都会处理来自客户端的请求,从而实现负载均衡。

结论

上述代码展示了如何使用 cluster 模块来创建多个子进程,每个子进程运行在不同的 CPU 核心上。这种方式比启动多个独立的 Node.js 进程更高效,因为它们共享同一个端口,并且可以更好地管理资源。因此,如果你想充分利用多核 CPU 性能,使用 cluster 模块是一个不错的选择。


对,用第二种

要充分利用多核 CPU 的性能,可以使用 Node.js 中的 cluster 模块来创建子进程,每个子进程都可以独立地处理请求。以下是一个示例代码,展示了如何使用 cluster 模块来实现这一目标:

示例代码

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

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

    // 创建与 CPU 数量相等的工作进程
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }

    Object.values(cluster.workers).forEach(worker => {
        worker.on('exit', () => {
            console.log(`工作进程 ${worker.process.pid} 已退出`);
            // 如果某个工作进程退出,重新创建一个新的工作进程
            cluster.fork();
        });
    });

} else {
    // 子进程将启动一个 Express 应用
    const express = require('express');
    const app = express();

    app.get('/', (req, res) => {
        res.send('Hello World!');
    });

    app.listen(3000, () => {
        console.log(`工作进程 ${process.pid} 监听在端口 3000`);
    });
}

解释

  1. 主进程

    • 使用 cluster.isMaster 来判断当前是否为主进程。
    • 根据 CPU 数量创建相应数量的工作进程。
    • 监听工作进程的退出事件,并在工作进程退出时自动重启新的工作进程。
  2. 工作进程

    • 使用 cluster.fork() 创建的工作进程将执行这里的代码。
    • 每个工作进程会启动一个 Express 应用并监听同一个端口(例如 3000)。
    • 这样可以确保不同的工作进程能够独立处理不同的请求,从而充分利用多核 CPU 性能。

通过这种方式,你可以让 Node.js 应用充分利用多核 CPU 性能,而不需要启动多个独立的 Node.js 程序。

回到顶部