搜尋

首頁  >  問答  >  主體

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深入淺出,讀起來還真是有點費勁啊

我想大声告诉你我想大声告诉你2749 天前597

全部回覆(1)我來回復

  • 阿神

    阿神2017-05-16 13:47:26

    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上的問題可以看這裡

    回覆
    0
  • 取消回覆