javascript - nodejs關(guān)于進(jìn)程間發(fā)送句柄的一點(diǎn)疑問(wèn)
問(wèn)題描述
先看一個(gè)一個(gè)應(yīng)用程序,通過(guò)net服務(wù)觸發(fā) http服務(wù);
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);})
簡(jiǎn)單來(lái)說(shuō)就是 初始化兩個(gè)服務(wù) 一個(gè)net服務(wù) 一個(gè)http服務(wù),用net服務(wù)監(jiān)聽(tīng)端口,客戶端連接后,觸發(fā)http服務(wù)的連接事件,并將socket傳給http服務(wù);里面有一行注釋,如果關(guān)閉注釋,服務(wù)就關(guān)閉了;但是再看另一個(gè)應(yīng)用,這里涉及到了子進(jìn)程模塊,還有進(jìn)程間的句柄傳遞;看程序;
父進(jìn)程文件:
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();})
子進(jìn)程文件:
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); })})
大家看父進(jìn)程文件里也有一行注釋,但是這里的注釋去掉后,服務(wù)能正常工作,這是什么原因呢?父進(jìn)程的net服務(wù)已經(jīng)關(guān)閉了,已經(jīng)不監(jiān)聽(tīng)3000端口了,想不明不白在代碼層面理解 父進(jìn)程結(jié)束了,但是子進(jìn)程沒(méi)有結(jié)束,但是請(qǐng)求的流是怎么運(yùn)行的呢,或者說(shuō)這個(gè)代碼是怎么運(yùn)行的,思緒有點(diǎn)亂啊,node深入淺出,讀起來(lái)還真是有點(diǎn)費(fèi)勁啊
問(wèn)題解答
回答1:google了一下,在stackoverflow上找到一個(gè)類似的問(wèn)題
關(guān)鍵應(yīng)該在這一段上handleConversion在send時(shí)有handle參數(shù)的情況下,會(huì)調(diào)用handleConversion[type]可以看到在type:'net.Server'時(shí),send的是server._handle而接收時(shí)是這樣的
got: function(message, handle, emit) { var self = this; var server = new net.Server(); server.listen(handle, function() {emit(server); });}
也就是說(shuō)父進(jìn)程send了server._handle而子進(jìn)程則使用這個(gè)handle重建了一個(gè)server所以實(shí)際上子進(jìn)程中的server已經(jīng)跟父進(jìn)程中的不是同一個(gè)了,父進(jìn)程的server.close自然不會(huì)對(duì)子進(jìn)程產(chǎn)生影響
stackoverflow上的問(wèn)題可以看這里
相關(guān)文章:
1. mysql - 電商如何存儲(chǔ)營(yíng)業(yè)額數(shù)據(jù)2. javascript - 關(guān)于nodejs處理并發(fā)的一點(diǎn)小疑惑3. javascript - 表單ajax提交后跳轉(zhuǎn),手機(jī)按返回又進(jìn)入這個(gè)表單頁(yè)了!!4. javascript - sublime快鍵鍵問(wèn)題5. javascript - node中為中間層如何解決跨域問(wèn)題6. python - nginx 小白, nginx 啟動(dòng)后 80 端口無(wú)法訪問(wèn)7. css3 - css做動(dòng)畫效果8. javascript - avalon使用:duplex設(shè)置select默認(rèn)option的bug9. HTML5禁止img預(yù)覽該怎么解決?10. css如何實(shí)現(xiàn)兩欄布局,左邊固定寬度,右邊寬度自適應(yīng),且高度和瀏覽器當(dāng)前高度一致?
