进程通信
2024年04月09日
一、认识
在 Node.js
中, 进程间通信主要依赖于内置的 IPC
机制。当使用 fork
或 cluster
模块创建子进程时, Node
自动为父子进程之间建立了一个基于管道的 IPC
通道。通过 process.send()
方法,父进程可以发送 JSON
格式的消息给子进程, 子进程通过监听 message
事件接收并处理这些消息, 并能通过同样的方式将处理结果返回给父进程。整个过程是异步、事件驱动的,保证了高效的数据交互和任务分发。在实际应用中,这种机制常用于任务并行化,比如将计算密集型任务下发给子进程处理,利用多核资源,从而避免主线程阻塞,同时也能通过集群模式进一步扩展服务能力。除此之外,我们也会注意在进程通信中做好错误处理和事件监控,确保系统在异常情况下能迅速响应。
二、语法
2.1 子线程
// child.js
process.on('message', (msg) => {
console.log('子进程接收到消息:', msg);
// 处理任务,比如将传入数组中的数字翻倍
if (msg && msg.data && Array.isArray(msg.data)) {
const result = msg.data.map(x => x * 2);
// 发送处理结果回父进程
process.send({ result });
}
});
2.2 主线程
const { fork } = require('child_process');
// 创建子进程
const child = fork('./child.js');
// 监听来自子进程的消息
child.on('message', (msg) => {
console.log('主进程接收到子进程返回的消息:', msg);
});
// 向子进程发送任务数据
child.send({ data: [1, 2, 3, 4] });
// 监听错误和退出事件,增强健壮性
child.on('error', (err) => {
console.error('子进程发生错误:', err);
});
child.on('exit', (code) => {
console.log(`子进程退出,退出码: ${code}`);
});
三、问题
3.1 Node 中进程间是如何进行通信的?
同上