我是nodejs的新手,目前正在使用它的功能,我遇到的一个重要功能是群集,我尝试使用expressjs,angular和nodejs为我的示例应用程序实现它。 / p>
群集代码:
<a href="whatsapp://send?text=http://www.example.com/index.php?route=product/product&product_id=50" data-action="share/whatsapp/share">Share via Whatsapp</a>
我在我的路由器中添加了以下代码来阻止事件循环,所以当我发出第一个请求它会阻塞一个nodejs worker。因此,如果另一个用户在第一个节点被阻止时进行呼叫,则第二个工作人员应该选择它。
路由器代码:
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');
});
}
它不会使用其他工作程序提供其他请求并等待被阻止的节点工作程序.BTW我使用的是节点js版本0.12.7(64位)和4位cpus。
提前谢谢..
答案 0 :(得分:1)
它不会使用其他工作程序提供其他请求并等待阻塞的节点工作程序
您的测试方法可能不对。这是您样本的简化版本。
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')
})
}
如果我在一个终端中运行它,然后打开另外两个终端并尽可能快地在每个终端中激活curl localhost:3003
,我可以看到第二个请求到达并在第一个请求得到响应之前开始处理:
pid 53434 handler start, blocking CPU
pid 53437 handler start, blocking CPU
pid 53434 unblocked, responding
pid 53437 unblocked, responding