多个child_process监听同一端口,客户端请求被阻塞,求解?
发布于 7 年前 作者 huenyifei 2874 次浏览 来自 问答

以下示例源于《Nodejs深入浅出》,运行平台Win7 32位系统。 服务器代码: //以下代码保存为 'master.js’ var fork = require(‘child_process’).fork; var cpus = require(‘os’).cpus();

var server = require(‘net’).createServer(); server.listen(1337, function(){ for(var i = 0; i < cpus.length; i++){ createWorker(); } // server.close(); });

var createWorker = function(){ var worker = fork(__dirname + ‘/worker.js’); worker.send(‘server’, server); console.log('Create worker. pid: ’ + worker.pid); };


//以下代码保存为 'worker.js’ var http = require(‘http’); var server = http.createServer(function(req, res){ res.writeHead(200,{‘Content-Type’: ‘text/plain’}); res.end('handled by child, pid is ’ + process.pid + ‘\n’); });

process.on(‘message’, function(m, tcp){ if(m === ‘server’){ tcp.on(‘connection’, function(socket){ server.emit(‘connection’, socket); }); } });

客户端代码 //以下代码 ‘client.js’ const http = require(‘http’); var options = { hostname: ‘127.0.0.1’, port:1337, path:’/’, method:‘GET’ };

for(var i = 0; i<10; i++){ var req = http.request(options, function(res){ res.on(‘data’, function(chunk){ console.log(chunk.toString()); }); }); req.end() }

启动服务器:'node master.js’ 启动客户端:'node client.js’ 运行结果: O7PPY.png

如果放开master.js中的"// server.close();"的注释,客户端就不会被阻塞。 运行结果: uSfUz.png

请问,这是什么原因导致的,我应该如何修改代码?谢谢各位!

5 回复

这个例子没问题。。。 首先你搞错了一点,朴老师的这个例子是想告你cluster的运行原理:只在主进程监听端口,然后由主进程分发给子进程进行处理

@hyj1991 谢谢你的回答。作者的意思我是明白的。我在动手的时候发现了这个问题,我很想知道是什么原因让客户端阻塞了。另外,如何修改代码能让客户端正常运行。

@huenyifei 我本地跑了下这个段代码,没啥问题。。。没有阻塞,你用的node版本是啥

@hyj1991 这么关键的信息没有给出来,是我出来搞笑了,我明天去确认一下。Thanks。 From Noder

@hyj1991 我笔记本上使用的是v6.10.0,会阻塞。之后我再台式机上安装了nodejs - v6.10.2仍然阻塞。你使用的版本是?是不是因为机器快?如果把 client.js 的并发送从10改到100呢?

回到顶部