考虑:
// 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');
});
}
});
如上例所示,父服务器将服务器对象发送到子进程,以便即使是子进程也处理了一些客户端连接请求。
如何在Node.js中实现?
答案 0 :(得分:4)
这是what node does when process.send
is called with a handle
argument。
阅读之后,the handleConversion
function也很有趣。
我还没有完全理解它,但我认为套接字/服务器的状态基本上是序列化的,并使用IPC在master / worker之间传递。也许传递的状态足以让每个进程将自己绑定到套接字?或者父母可能会保留一个可以处理任何给定套接字的子进程的注册表,所以一旦新连接进入某个套接字,它就会被发送给注册它的子进程。那部分我不太确定。
答案 1 :(得分:3)
现在是possible,但前提是您正在使用net
模块。
child.send('socket', socket);
使用第二个参数发送:
从子进程接收:
process.on('message', function(m, socket) {
if (m === 'socket') {
console.log(socket); // Net socket object here
}
});
答案 2 :(得分:2)
我建议你看看Node.js cluster module:
当您在worker中调用
server.listen(...)
时,它会序列化参数并将请求传递给主进程。如果主进程已经具有与工作者要求匹配的侦听服务器,则它将句柄传递给工作者。如果它还没有匹配该要求的侦听服务器,那么它将创建一个,并将句柄传递给该子句。
来自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);
}