javascript - nodejs關于進程間發(fā)送句柄的一點疑問
問題描述
先看一個一個應用程序,通過net服務觸發(fā) 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服務監(jiān)聽端口,客戶端連接后,觸發(fā)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服務已經(jīng)關閉了,已經(jīng)不監(jiān)聽3000端口了,想不明不白在代碼層面理解 父進程結束了,但是子進程沒有結束,但是請求的流是怎么運行的呢,或者說這個代碼是怎么運行的,思緒有點亂啊,node深入淺出,讀起來還真是有點費勁啊
問題解答
回答1:google了一下,在stackoverflow上找到一個類似的問題
關鍵應該在這一段上handleConversion在send時有handle參數(shù)的情況下,會調(diào)用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已經(jīng)跟父進程中的不是同一個了,父進程的server.close自然不會對子進程產(chǎn)生影響
stackoverflow上的問題可以看這里
相關文章:
1. 為什么我ping不通我的docker容器呢???2. docker - 各位電腦上有多少個容器啊?容器一多,自己都搞混了,咋辦呢?3. docker-compose中volumes的問題4. docker內(nèi)創(chuàng)建jenkins訪問另一個容器下的服務器問題5. 關docker hub上有些鏡像的tag被標記““This image has vulnerabilities””6. mac連接阿里云docker集群,已經(jīng)卡了2天了,求問?7. docker鏡像push報錯8. angular.js - angular內(nèi)容過長展開收起效果9. dockerfile - 為什么docker容器啟動不了?10. angular.js使用$resource服務把數(shù)據(jù)存入mongodb的問題。
