javascript - nodejs关于进程间发送句柄的一点疑问
问题描述
先看一个一个应用程序,通过net服务触发 http服务;
const http = require(’http’);const net = require(’net’);let netServer = net.createServer();let httpServer = http.createServer((req, res)=>{ res.end(’ok’);})netServer.listen(3000,function(){ console.log('222222'); //netServer.close();})netServer.on(’connection’,(socket)=>{ httpServer.emit(’connection’,socket);})
简单来说就是 初始化两个服务 一个net服务 一个http服务,用net服务监听端口,客户端连接后,触发http服务的连接事件,并将socket传给http服务;里面有一行注释,如果关闭注释,服务就关闭了;但是再看另一个应用,这里涉及到了子进程模块,还有进程间的句柄传递;看程序;
父进程文件:
var cp = require(’child_process’);var net = require(’net’);var child1 = cp.fork(’./c.js’);var child2 = cp.fork(’./c.js’);var netServer = net.createServer();netServer.listen(3000,function(){ child1.send(’server’, netServer); child2.send(’server’, netServer); console.log('222222'); netServer.close();})
子进程文件:
const http = require(’http’);let httpServer = http.createServer((req, res)=>{ // res.writeHead(200,{’Content-Type’:’text/plain’ + ’n’}); res.end(’ok’);})process.on(’message’, function(m, tcp){ console.log(m); tcp.on(’connection’, function(socket){httpServer.emit(’connection’,socket); })})
大家看父进程文件里也有一行注释,但是这里的注释去掉后,服务能正常工作,这是什么原因呢?父进程的net服务已经关闭了,已经不监听3000端口了,想不明不白在代码层面理解 父进程结束了,但是子进程没有结束,但是请求的流是怎么运行的呢,或者说这个代码是怎么运行的,思绪有点乱啊,node深入浅出,读起来还真是有点费劲啊
问题解答
回答1:google了一下,在stackoverflow上找到一个类似的问题
关键应该在这一段上handleConversion在send时有handle参数的情况下,会调用handleConversion[type]可以看到在type:'net.Server'时,send的是server._handle而接收时是这样的
got: function(message, handle, emit) { var self = this; var server = new net.Server(); server.listen(handle, function() {emit(server); });}
也就是说父进程send了server._handle而子进程则使用这个handle重建了一个server所以实际上子进程中的server已经跟父进程中的不是同一个了,父进程的server.close自然不会对子进程产生影响
stackoverflow上的问题可以看这里
相关文章:
1. python - 求一个在def中可以实现调用本def满足特定条件continue效果的方法(标题说不太清楚,请见题内描述)2. MYSQL新建用户设置可以远程访问的问题3. $fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题4. java - mybatis怎么实现在数据库中有就修改,没有就添加5. node.js - nodejs和前端JavaScript 字符串处理结果不一样是什么原因?6. mysql多表联合查询优化的问题7. MySQL中的enum类型有什么优点?8. 数据库 - mysql 远程可以连接,但是本地连接拒绝?9. 数据库设计 - MySQL数据库主键问题10. linux - 为什么我在mysql的my.cnf下找不到bind-address?
![$fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题](http://www.haobala.com/attached/image/news/202205/093622cb60.png)