Node 如何进行进程间通信?
介绍 Node.js 中进程间通信的主要方式及其应用场景,包括使用 child_process 模块、标准流以及 cluster 模块的方法。
在 Node.js 中,进程间通信 (Inter-Process Communication, IPC) 主要通过以下方式实现,适用于子进程、工作进程等场景:
- 基于
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); // 父进程的消息 });
- 父进程发送消息:
- 使用
- 通过标准输入/输出流
- 使用
spawn()
或exec()
创建子进程时,可通过管道 (Pipe) 管理stdin
、stdout
和stderr
流: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}`); });
- 这是本地操作系统中具有亲缘关系的进程实现单向通信的方式(基于底层管道技术)。
- 使用
- 结合
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); });
- Master 进程发送消息:
这些方法利用了操作系统底层的 IPC 机制,如管道和消息队列(Message Queues),同时封装为简单 Node.js API,提升了跨进程通信的可靠性。选择合适的机制需基于性能开销和复杂性权衡。