跳到主要内容

进程通信

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, 父进程!' });
});