父进程如何发送套接字/服务器对象到Node.js中的subprocess?

考虑:

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

如上例所示,父级将服务器对象发送给subprocess,以便即使是subprocess也可以处理一些客户机连接请求。

在Node.js中如何实现?

我build议你看看Node.js集群模块 :

当您在worker中调用server.listen(...)时,它将序列化参数并将请求传递给主进程。 如果主进程已经有一个监听服务器匹配工作人员的要求,那么它将句柄传递给工作人员。 如果它没有符合该要求的侦听服务器,则它将创build一个,并将该句柄传递给该孩子。

文档中的完整示例:

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

这是当使用handle参数调用process.send时节点执行的操作 。

阅读后, handleConversion函数也是有趣的阅读。

我还没有完全理解它,但我认为本质上,套接字/服务器的状态是串行化的,并在使用IPC的主/工之间传递。 也许被传递的状态足够每个进程绑定自己的套接字? 或者,也许父母是保持registry的孩子谁可以处理任何给定的套接字,所以一旦一个新的连接进入一个套接字,它被发送到一个孩子注册。 这一部分我不太确定。

这是现在可能的 ,但只有当你使用net模块,你是。

child.send('socket', socket); 使用第二个参数发送:

并从儿童进程接收:

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