以下示例源于《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’ 运行结果:
如果放开master.js中的"// server.close();"的注释,客户端就不会被阻塞。 运行结果:
请问,这是什么原因导致的,我应该如何修改代码?谢谢各位!
这个例子没问题。。。 首先你搞错了一点,朴老师的这个例子是想告你cluster的运行原理:只在主进程监听端口,然后由主进程分发给子进程进行处理
@hyj1991 谢谢你的回答。作者的意思我是明白的。我在动手的时候发现了这个问题,我很想知道是什么原因让客户端阻塞了。另外,如何修改代码能让客户端正常运行。
@huenyifei 我本地跑了下这个段代码,没啥问题。。。没有阻塞,你用的node版本是啥
@hyj1991 我笔记本上使用的是v6.10.0,会阻塞。之后我再台式机上安装了nodejs - v6.10.2仍然阻塞。你使用的版本是?是不是因为机器快?如果把 client.js 的并发送从10改到100呢?