Node 如何进行进程间通信?

介绍 Node.js 中进程间通信的主要方式及其应用场景,包括使用 child_process 模块、标准流以及 cluster 模块的方法。

Node.js 中等 IPC 进程间通信 进程

在 Node.js 中,进程间通信 (Inter-Process Communication, IPC) 主要通过以下方式实现,适用于子进程、工作进程等场景:

  1. 基于 child_process 模块的 IPC 通道
    • 使用 fork() 方法创建子进程时,会自动建立 IPC 通道,允许父子进程互相发送消息。
      • 父进程发送消息:
        const { fork } = require('child_process');
        const child = fork('script.js');
        child.send({ command: 'start' }); // 向子进程发送消息
        
      • 子进程接收消息:
        process.on('message', (msg) => {
          console.log('Received from parent:', msg); // 父进程的消息
        });
        
  2. 通过标准输入/输出流
    • 使用 spawn()exec() 创建子进程时,可通过管道 (Pipe) 管理 stdinstdoutstderr 流:
      const { spawn } = require('child_process');
      const ls = spawn('ls', ['-lh', '/usr']);
      ls.stdout.on('data', (data) => {
        console.log(`Output: ${data}`); // 读取子进程输出
      });
      ls.stderr.on('data', (data) => {
        console.error(`Error: ${data}`);
      });
      
    • 这是本地操作系统中具有亲缘关系的进程实现单向通信的方式(基于底层管道技术)。
  3. 结合 cluster 模块扩展
    • cluster 用于创建共享端口的工作进程,内部通过 IPC 自动建立 Master-Worker 消息通道:
      • Master 进程发送消息:
        const cluster = require('cluster');
        if (cluster.isMaster) {
          const worker = cluster.fork();
          worker.send('Hello from master');
        }
        
      • Worker 进程接收消息:
        process.on('message', (msg) => {
          console.log('Master says:', msg);
        });
        

这些方法利用了操作系统底层的 IPC 机制,如管道和消息队列(Message Queues),同时封装为简单 Node.js API,提升了跨进程通信的可靠性。选择合适的机制需基于性能开销和复杂性权衡。