2012-11-28 3 views
5

Bedenken Sie:Wie kann ein Elternprozess das Socket/Server-Objekt an den untergeordneten Prozess in Node.js senden?

// 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'); 
    }); 
    } 
}); 

wie im obigen Beispiel gezeigt, senden Eltern Server-Objekt zu untergeordneten Prozessen, so dass selbst ein Kind einiger Anfragen von Client-Verbindung hatte zu behandeln.

Wie wird es in Node.js erreicht?

Antwort

2

Ich schlage vor, Sie nehmen einen Blick auf die Node.js cluster module:

Wenn Sie server.listen(...) in einem Arbeiter nennen, serialisiert es die Argumente und leitet die Anfrage an den Master-Prozess. Wenn der Master-Prozess bereits über einen Listener-Server verfügt, der den Anforderungen des Arbeiters entspricht, übergibt er den Handle an den Worker. Wenn es nicht bereits einen Listener-Server gibt, der diese Anforderung erfüllt, erstellt er einen und übergibt den Handle an das Kind.

Komplettes Beispiel aus 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

Hallo Linus, Can u etwas Licht auf werfen, wie Server-Objekt in dem Beispiel zu Kind-Prozess übergeben wird von mir gegeben? – Ashish

+0

Dies scheint die relevanten [Teile der Quelle] zu sein (https://github.com/joyent/node/blob/c668185adde3a474585a11f172b8387e270ec23b/lib/cluster.js#L523-558). –

+0

Neugierig gefragt; Funktioniert das mit 'child_process.fork'? –

3

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

Und nach dem Lesen, the handleConversion function ist auch interessant zu lesen.

Ich verstehe es noch nicht vollständig, aber ich denke im Wesentlichen der Status des Socket/Server ist serialisiert und zwischen Master/Worker mit IPC übergeben. Vielleicht ist der Zustand, der herumgereicht wird, genug für jeden Prozess, um sich an den Sockel zu binden? Oder vielleicht behält der Elternteil eine Registrierung von Kindern, die mit jedem gegebenen Socket umgehen können. Sobald also eine neue Verbindung für einen Socket eingeht, wird sie an ein Kind gesendet, das sich dafür registriert hat. Über diesen Teil bin ich mir weniger sicher.

3

Dies ist jetzt possible, aber nur wenn Sie das net Modul verwenden, die Sie sind.

child.send('socket', socket); den zweiten Parameter verwenden zu senden:

Und von Kind-Prozess zu erhalten:

process.on('message', function(m, socket) { 
    if (m === 'socket') { 
     console.log(socket); // Net socket object here 
    } 
}); 
Verwandte Themen