nodejs中怎么实现兄弟进程通信
发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,今天就跟大家聊聊有关nodejs中怎么实现兄弟进程通信,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。问题尽管我们可以在主进程中保存工作进程的实
千家信息网最后更新 2025年02月08日nodejs中怎么实现兄弟进程通信
今天就跟大家聊聊有关nodejs中怎么实现兄弟进程通信,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
问题
尽管我们可以在主进程中保存工作进程的实例,但是想通过主进程,完成工作进程和进程A的通信还是非常麻烦,步骤如下
1 首先主进程要监听每个工作进程发过来的任务
2 然后把任务传给进程A
3 进程A处理完后,通知主进程,主进程再把结果发给对任务对应的子进程 其中,工作进程需要保存任务对应的上下文(比如说回调),因为工作进程可能同时给主进程发送了多个任务,当主进程通知工作进程某个任务完成的时候,工作进程需要通过任务找到对应的上下文,然后进行下一步处理,比如执行回调。
解决方案
在主进程中开启一个服务,实现没有继承关系的子进程间通信,选取的进程间通信方式是unix域,没有选tcp是因为同主机的进程间通信,使用tcp过于重和低效(需要经过协议栈的封包和解包)。子进程可以通过该服务和主进程通信,然后主进程转发请求给处理cpu型任务的子进程。结构如下在主进程而不是进程A中开启unix域服务是因为以后新增处理其他任务的子进程时,可以复用该unix域服务,起到api网关的作用。但是多了一层,会多了一些通信的成本。更直接的可以使用以下结构
具体实现
客户端
const net = require('net');
const { EventEmitter } = require('events');
class Work extends EventEmitter {}
class UnixDomainClient extends EventEmitter {
constructor(options) {
super();
this.options = options;
}
send(data) {
const work = new Work();
const socket = net.connect(this.options.path);
socket.end(JSON.stringify(data));
socket.on('error', (e) => {
work.emit('error', e);
});
let res = null;
socket.on('data', (chunk) => {
res = res ? Buffer.concat([res, chunk]) : chunk;
});
socket.on('end', () => {
work.emit('message', res && res.toString());
});
return work;
}
}
const work = new UnixDomainClient({path: '/tmp/test.sock'}).send('hello');
work.on('message', function(res) {
console.log(res);
})
服务器
const fs = require('fs');const net = require('net');const constants = { UNIX_PATH: '/tmp/test.sock',}if (fs.existsSync(constants.UNIX_PATH)) { fs.unlinkSync(constants.UNIX_PATH);}const server = net.createServer({ allowHalfOpen: true }, (client) => { let data = null; client.on('data', (chunk) => { data = data ? Buffer.concat([data, chunk]) : chunk; }); client.on('end', () => { console.log(`recive msg: ${data.toString()}`) client.end('world'); });});server.listen(constants.UNIX_PATH, () => { console.log(`bind uinx path ${constants.UNIX_PATH}`);});server.on('error', (error) => { console.log(`unix domain server error ${error.toString()}`);});process.on('exit', () => { if (fs.existsSync(constants.UNIX_PATH)) { fs.unlinkSync(constants.UNIX_PATH); }});
看完上述内容,你们对nodejs中怎么实现兄弟进程通信有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
进程
任务
通信
工作
服务
处理
内容
兄弟
上下
上下文
结构
主机
低效
作用
可以使
可以通过
同时
多个
实例
客户
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全五年级知识
afc网络安全设计方案
护苗网络安全课视频之四
智慧交通数据库设计及研究
mega2021数据库安装教程
中国台湾oa软件开发常用指南
网络安全基础知识ppt
计算机软件开发与硬件开发
女生公安专业报网络技术好吗
公司网络技术岗职责
mysql对数据库进行备份
计算机网络技术电子信息大类
清远电子仓库软件开发
在数据库安全性
服务器里看端口
华为服务器5288v3网卡名称
项目控制软件开发
京剧猫手游没有服务器怎么办
科技创新互联网风控
不开机怎么查看服务器配置
知乎用什么服务器
网络技术支持工程师招聘
下载计算机网络技术毕业论文
考勤机应该导出哪个数据库
怎么建立车牌识别数据库
陕西车神互联网科技有限公司
惠州市非遗数据库
彭博数据库可以按月使用
大话西游君临天下是哪个服务器
服务器管理如何