返回

用 child_process 管理子进程:让 Node.js 掌控一切

前端

在这个多任务处理的时代,Node.js 的 child_process 模块应运而生,它使我们能够在 Node.js 脚本中创建、管理和通信子进程。本指南将带领你领略 child_process 模块的强大功能,为你揭开子进程管理的神秘面纱。

  1. 子进程 API 简介

    child_process 模块提供了丰富的 API 来创建和管理子进程,主要包括以下几个方法:

    • spawn():创建一个新的子进程,并返回一个 ChildProcess 对象。
    • exec():执行一个 shell 命令,并返回一个 Promise 对象。
    • execFile():执行一个可执行文件,并返回一个 Promise 对象。
    • fork():创建一个新的子进程,并返回一个 ChildProcess 对象。与 spawn() 不同的是,fork() 会复制当前进程的内存空间。
    • cluster:这是一个模块,可帮助我们轻松地创建和管理多进程应用程序。
  2. 子进程的创建

    2.1. 使用 spawn() 创建子进程

    const { spawn } = require('child_process');
    
    const child = spawn('ls', ['-lh']);
    
    child.stdout.on('data', (data) => {
      console.log(`stdout: ${data}`);
    });
    
    child.stderr.on('data', (data) => {
      console.log(`stderr: ${data}`);
    });
    
    child.on('close', (code) => {
      console.log(`child process exited with code ${code}`);
    });
    

    2.2. 使用 exec() 执行 shell 命令

    const { exec } = require('child_process');
    
    exec('ls -lh', (err, stdout, stderr) => {
      if (err) {
        console.error(`exec error: ${err}`);
        return;
      }
    
      console.log(`stdout: ${stdout}`);
      console.log(`stderr: ${stderr}`);
    });
    

    2.3. 使用 execFile() 执行可执行文件

    const { execFile } = require('child_process');
    
    execFile('node', ['--version'], (err, stdout, stderr) => {
      if (err) {
        console.error(`execFile error: ${err}`);
        return;
      }
    
      console.log(`stdout: ${stdout}`);
      console.log(`stderr: ${stderr}`);
    });
    

    2.4. 使用 fork() 创建子进程

    const { fork } = require('child_process');
    
    const child = fork('child.js');
    
    child.on('message', (msg) => {
      console.log(`message from child: ${msg}`);
    });
    
    child.send('Hello from parent');
    
  3. 子进程的通信

    子进程与父进程可以通过流对象进行通信。子进程的 stdout 和 stderr 流可以用来接收子进程的输出,而子进程的 stdin 流可以用来向子进程发送输入。

    const { spawn } = require('child_process');
    
    const child = spawn('ls', ['-lh']);
    
    child.stdout.on('data', (data) => {
      console.log(`stdout: ${data}`);
    });
    
    child.stderr.on('data', (data) => {
      console.log(`stderr: ${data}`);
    });
    
    child.stdin.write('Hello from parent\n');
    
  4. 使用 cluster 模块

    cluster 模块可以帮助我们轻松地创建和管理多进程应用程序。它允许我们创建多个工作进程,这些工作进程可以并行处理任务。

    const cluster = require('cluster');
    
    if (cluster.isMaster) {
      // Create worker processes.
      for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
      }
    
      // Listen for worker process messages.
      cluster.on('message', (worker, msg) => {
        console.log(`message from worker ${worker.process.pid}: ${msg}`);
      });
    
    } else {
      // Worker process code.
      // ...
    }
    
  5. 总结

    child_process 模块是 Node.js 中一个强大的工具,它可以帮助我们创建、管理和通信子进程。本文介绍了 child_process 模块的主要 API 及其用法,让你能够轻松掌控子进程的世界。