2012-11-28 18 views
5

Rozważmy:W jaki sposób proces nadrzędny może wysłać obiekt gniazdo/serwer do procesu potomnego w pliku Node.js?

// Parent 

var child = require('child_process').fork('child.js'); 

// Open up the server object and send the handle. 
var server = require('net').createServer(); 
server.on('connection', function (socket) { 
    socket.end('handled by parent'); 
}); 
server.listen(1337, function() { 
    child.send('server', server); 
}); 

//Child 
process.on('message', function(m, server) { 
    if (m === 'server') { 
    server.on('connection', function (socket) { 
     socket.end('handled by child'); 
    }); 
    } 
}); 

Jak widać na powyższym przykładzie, rodzice wysyła obiekt serwera procesów podrzędnych tak, że nawet dziecko miał obsługiwać niektóre z żądań połączeń klienta.

Jak to osiągnąć w Node.js?

Odpowiedz

2

Proponuję spojrzeć na Node.js cluster module:

Po wywołaniu server.listen(...) w pracownika, to serializuje argumentów i przekazuje żądanie do procesu nadrzędnego. Jeśli proces główny ma już serwer nasłuchujący zgodny z wymaganiami pracownika, przekazuje uchwyt do procesu roboczego. Jeśli nie ma już serwera nasłuchującego spełniającego to wymaganie, utworzy go i przekaże uchwyt do potomka.

Kompletny przykład z the documentation:

var cluster = require('cluster'); 
var http = require('http'); 
var numCPUs = require('os').cpus().length; 

if (cluster.isMaster) { 
    // Fork workers. 
    for (var i = 0; i < numCPUs; i++) { 
    cluster.fork(); 
    } 

    cluster.on('exit', function(worker, code, signal) { 
    console.log('worker ' + worker.process.pid + ' died'); 
    }); 
} else { 
    // Workers can share any TCP connection 
    // In this case it's an HTTP server 
    http.createServer(function(req, res) { 
    res.writeHead(200); 
    res.end("hello world\n"); 
    }).listen(8000); 
} 
+0

Hi Linusa, u można rzucić nieco światła na to, jak obiekt serwera jest przekazywane do procesu potomnego w przykładzie dane przeze mnie? – Ashish

+0

To wydaje się być odpowiednie [części źródła] (https://github.com/joyent/node/blob/c668185adde3a474585a11f172b8387e270ec23b/lib/cluster.js#L523-558). –

+0

Curiosly asked; czy to zadziała z 'child_process.fork'? –

3

Oto what node does when process.send is called with a handle argument.

A po przeczytaniu tego, interesujące jest również przeczytanie the handleConversion function.

Nie do końca to rozumiem, ale myślę, że zasadniczo stan gniazda/serwera jest serializowany i przekazywany pomiędzy głównym/pracującym przy użyciu IPC. Może przekazywany stan wystarczy, aby każdy proces wiązał się z gniazdem? A może rodzic prowadzi rejestr dzieci, które mogą obsłużyć dane gniazdo, więc gdy nowe połączenie pojawi się w przypadku jakiegoś gniazda, zostanie ono wysłane do dziecka, które się do niego zarejestrowało. Ta część jestem mniej pewna.

3

To jest teraz possible, ale tylko jeśli używasz modułu net, którym jesteś.

child.send('socket', socket); Użyj drugi parametr wysłać:

A otrzymywać od procesu potomnego:

process.on('message', function(m, socket) { 
    if (m === 'socket') { 
     console.log(socket); // Net socket object here 
    } 
}); 
Powiązane problemy