6

考虑:

// 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 中实现的?

4

3 回答 3

5

这是使用参数调用节点时process.sendhandle的操作。

读完之后,这个handleConversion函数读起来也很有趣。

我还没有完全理解它,但我认为基本上套接字/服务器的状态是序列化的,并使用 IPC 在主/从器之间传递。也许传递的状态足以让每个进程将自己绑定到套接字?或者,父母可能会保留一个可以处理任何给定套接字的孩子的注册表,因此一旦某个套接字的新连接进入,它就会被发送给为其注册的孩子。那部分我不太确定。

于 2013-12-07T22:19:58.450 回答
4

现在这是可能的,但前提是您使用的是net模块。

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

并从子进程接收:

process.on('message', function(m, socket) {
   if (m === 'socket') {
       console.log(socket); // Net socket object here
   }
});
于 2015-09-18T18:50:20.103 回答
2

我建议你看看Node.js 集群模块

当你调用server.listen(...)一个工作进程时,它会序列化参数并将请求传递给主进程。如果主进程已经有一个匹配工作者要求的监听服务器,那么它将句柄传递给工作者。如果它还没有匹配该要求的侦听服务器,那么它将创建一个,并将句柄传递给子进程。

文档中的完整示例:

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);
}
于 2012-11-28T12:32:13.747 回答