如何validation群集在节点js中工作?

我是nodejs的新手,目前正在使用它的特性,我遇到的一个重要特性是Cluster ,我尝试使用expressjs,angular和nodejs来实现我的示例应用程序。

集群代码:

var cluster = require('cluster'); if (cluster.isMaster) { var cpuCount = require('os').cpus().length; for (var i = 0; i < cpuCount; i += 1) { cluster.fork(); } } else { var express = require('express'); var app = express(); var exportRouter=require('./routers/exportRouter'); var process = require('process'); fakeDB = []; app.use(express.static(__dirname + '/public')); app.use(require('./routers/exportRouter.js')); console.log('process Id :',process.pid); app.listen(3000, function(){ console.log('running on 30000'); }); } 

我在路由器中添加了以下代码来阻止事件循环,所以当我提出第一个请求时,它将阻塞一个nodejs worker。 所以如果另一个用户在第一个节点被阻塞时拨打电话,第二个工作人员应该select该节点。

路由器代码:

 var express = require('express'); var exportRouter = express.Router(); var process = require('process'); exportRouter.get('/getMe',function(req,res){ console.log('I am using process ',process.pid); console.log('get is called'); fakeDB.push(req.query.newName+' '+ process.pid); res.send(req.query.newName + ' ' + process.pid); console.log('New name received ',fakeDB); console.log('New name received ',fakeDB); var d = new Date().getTime(); console.log('old ',d) var x = d+10000; console.log('should stop post ',x); while(true){ var a = new Date().getTime(); //console.log('new ',a) if(x<a){ break; } } console.log('I am releasing event loop for ',process.pid); }); module.exports = exportRouter; 

它不服务其他请求使用其他工作人员,并等待阻止节点工人。顺便说一句我使用的节点js版本0.12.7(64位)和4 cpus。

提前致谢..

它不会使用其他工作人员提供其他请求,并等待被阻止的节点工作人员

您的testing方法可能是错误的。 以下是您的示例的简化版本。

 var cluster = require('cluster') if (cluster.isMaster) { var cpuCount = require('os').cpus().length for (var i = 0; i < cpuCount; i += 1) { cluster.fork() } } else { var express = require('express') var app = express() console.log('process Id:', process.pid) app.get('/', function (req, res) { console.log('pid', process.pid, 'handler start, blocking CPU') var i = 0; while (i < 10e9) { i++ } console.log('pid', process.pid, 'unblocked, responding') res.send('thanks') }) app.listen(3003, function () { console.log('running on 3003') }) } 

如果我在一个terminal上运行这个命令,那么打开另外两个terminal,并且尽可能快地在每个terminal上closures一个curl localhost:3003 ,我可以看到第二个请求到达并在第一个请求得到响应之前开始处理:

 pid 53434 handler start, blocking CPU pid 53437 handler start, blocking CPU pid 53434 unblocked, responding pid 53437 unblocked, responding