进程通信
2024年04月09日
一、、spawn() IPC 通信
通信机制: spawn()
方法用于创建子进程,它不会直接通过 IPC
发送消息,而是通过 标准输入(stdin
)、标准输出(stdout
) 和 标准错误输出(stderr
) 进行数据交换。通常用于启动和控制外部进程。父进程通过 spawn()
启动一个 Node.js
子进程,并通过标准输入(stdin.write()
)发送数据。子进程接收到输入后,打印并将结果通过标准输出(stdout.write()
)发送回父进程。父进程监听标准输出,接收来自子进程的返回数据。
父进程代码
const { spawn } = require('child_process');
// 启动子进程
const child = spawn('node', ['child.js']);
// 向子进程写入数据
child.stdin.write('Hello from parent!\n');
// 从子进程读取输出
child.stdout.on('data', (data) => {
console.log(`从子进程接收到的数据: ${data}`);
});
子进程代码
process.stdin.on('data', (data) => {
console.log(`子进程接收到数据: ${data}`);
process.stdout.write('Hello from child!\n');
});
二、Cluster IPC 通信
多进程通信机制: cluster
模块使得 Node.js
可以利用多核 CPU
,进行多进程处理。每个工作进程都可以通过 IPC
通道与主进程通信。在 cluster
模块中,主进程通过 fork()
创建工作进程,每个工作进程都会通过 process.send()
向主进程发送消息。进程通过 cluster.on('message')
监听来自工作进程的消息。
父进程代码
const cluster = require('cluster');
const http = require('http');
if (cluster.isMaster) {
// 主进程创建工作进程
cluster.fork();
// 监听工作进程发送的消息
cluster.on('message', (worker, message) => {
console.log('主进程接收到消息:', message);
});
} else {
// 工作进程发送消息给主进程
process.send({ msg: 'Hello from worker!' });
// 模拟工作进程的 HTTP 服务器
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello, World!');
}).listen(8000);
}
三、Child_process IPC 通信
Node.js
提供了 child_process
模块来创建子进程,并允许父进程和子进程进行消息传递。这是 Node.js
中最常见的 IPC
机制:父进程使用 fork()
创建了一个子进程,并通过 send()
向子进程发送一个消息。子进程接收到消息后,通过 process.on('message')
监听消息,并在处理完消息后通过 process.send()
向父进程发送回复。父进程通过 on('message')
监听子进程返回的消息。
父进程代码
const { fork } = require('child_process');
// 创建子进程,执行子进程脚本
const child = fork('child.js');
// 监听子进程发送的消息
child.on('message', (msg) => {
console.log('父进程接收到消息:', msg);
});
// 向子进程发送消息
child.send({ from: '父进程', data: 'Hello, 子进程!' });
子进程代码
// 监听父进程发送的消息
process.on('message', (msg) => {
console.log('子进程接收到消息:', msg);
// 向父进程发送回复消息
process.send({ from: '子进程', data: 'Hello, 父进程!' });
});