Nodejs系列: child_process 和 cluster 的关系

116 阅读3分钟

Nodejs中创建子进程有两种方法:

1. child_process模块(基础方法)

  • child_process.spawn()
  • child_process.exec(): 会将命令输出缓冲起来, 命令执行完后,将整个输出作为参数传递给回调函数
  • child_process.execFile(): 直接执行一个特定的可执行文件,而不是shell命令
const child_process = require('child_process');
const child = child_process.spawn('ls', ['-l']);
child.stdout.on('data', (data) => {
    console.log(`标准输出: ${data}`);
});
child.stderr.on('data', (data) => {
    console.log(`标准错误输出: ${data}`);
});
child.on('close', (code) => {
    console.log(`子进程退出,退出码: ${code}`);
});
const child_process = require('child_process');
child_process.exec('find. -type f', (err, stdout, stderr) => {
    if (err) {
        console.error(`执行命令出错: ${err}`);
        return;
    }
    console.log(`标准输出: ${stdout}`);
    console.log(`标准错误输出: ${stderr}`);
});

2. cluster模块(用于创建集群中的子进程)

  • cluster.fork()

两种方式的区别:

两者都依赖于操作系统的进程管理机制来创建和管理进程。它们在底层都涉及到进程的创建、资源分配和通信等操作。 在Node.js中,它们都可以使用IPC机制,如通过消息传递、共享文件描述符等方式来实现通信。

  • 例如,child_process的子进程可能需要将执行结果返回给主进程,cluster中的主进程和工作进程之间也需要通信来协调任务分配监控工作进程状态

1. 功能目的

  • child_process模块:主要用于在Node.js主进程中创建和管理子进程来执行外部命令或脚本。这些子进程可以是任何可执行的程序,
    • 比如运行一个Python脚本、执行系统命令(如lsgrep)等,重点在于与外部程序交互
  • cluster模块:用于创建Node.js进程的集群,目的是充分利用多核CPU资源,提升Node.js应用程序的性能。
    • 它主要用于创建多个Node.js工作进程,这些进程运行相同的JavaScript代码,协同处理网络请求或其他任务。

2. 进程关系和管理

  • child_process模块:创建的子进程和主进程之间是相对独立的关系
    • 每个子进程有自己独立的执行环境,可能执行与主进程完全不同的任务。
    • 主进程需要通过事件和消息机制来管理子进程的输出、错误和退出状态。
  • cluster模块:创建的工作进程之间是对等的关系
    • 它们共享相同的服务器端口(在网络应用场景下),并且在主进程的协调下,共同处理任务
    • 主进程主要负责监控工作进程的状态,当工作进程出现异常退出时,主进程会重新启动新的工作进程。

3. 应用场景

  • child_process模块:适用于需要调用外部程序、工具,或者执行系统命令的场景
    • 例如,在构建工具中调用打包工具(如webpack通过命令行调用),
    • 或者在Node.js应用中执行一些数据处理脚本(如使用Python脚本处理数据)。
  • cluster模块:更侧重于提升Node.js服务的性能和可用性。
    • 特别是在构建高并发的网络服务器(如HTTP、WebSocket服务器)时,
      • 通过创建集群,让多个工作进程同时处理请求,提高系统的吞吐量和响应速度。

简单来说的话, cluster是为了提高性能,child_process主要用于调用外部程序