我正在使用node.js进行聚类练习,我的CPU有两个核心。我创建了两个工作进程,每个工作进程运行一个简单的http服务器。服务器响应回调将会阻塞5秒钟,以便将下一个请求发送给另一个工作进程。为了验证工作进程是否并行工作,我在Firefox中打开了多个选项卡并刷新了每一个,问题是总是(99%)只有一个工作进程响应通过刷新选项卡发出的请求。只有一个工作进程提供一个请求,所有其他请求都被阻塞,直到该工作进程完成。这是我的代码 CODE:
var cluster = require('cluster');
var http = require('http');
if (cluster.isMaster) {
var cpus = require('os').cpus().length;
console.log('No of cpus:' + cpus);
console.log(require('os').cpus());
for (var i = 0; i < cpus; i++) {
cluster.fork();
}
cluster.on('fork', function(worker) {
console.log('worker:' + worker.id + " is forked");
});
cluster.on('online', function(worker) {
console.log('worker:' + worker.id + " is online");
});
cluster.on('listening', function(worker) {
console.log('worker:' + worker.id + " is listening");
});
cluster.on('disconnect', function(worker) {
console.log('worker:' + worker.id + " is disconnected");
});
cluster.on('exit', function(worker) {
console.log('worker:' + worker.id + " is dead");
});
} else {
http.createServer(function(req, res) {
console.log('worker:' + cluster.worker.id + " going to send response ");
res.writeHead(200);
res.end("hello world. worker: " + cluster.worker.id);
var stop = new Date().getTime();
while (new Date().getTime() < stop + 5000) {;
}
}).listen(8000);
}
输出:
20 Aug 00:36:11 - [nodemon] restarting due to changes...
20 Aug 00:36:12 - [nodemon] starting `node cluster.js`
No of cpus:2
[ { model: 'Intel(R) Core(TM)2 Duo CPU E4500 @ 2.20GHz',
speed: 2200,
times: { user: 2264671, nice: 0, sys: 698343, idle: 5965109, irq: 98812 } },
{ model: 'Intel(R) Core(TM)2 Duo CPU E4500 @ 2.20GHz',
speed: 2200,
times: { user: 2466000, nice: 0, sys: 502562, idle: 5959203, irq: 4609 } } ]
worker:1 is forked
worker:2 is forked
worker:2 is online
worker:1 is online
worker:2 is listening
worker:1 is listening
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
我注意到一件事情。如果我强制刷新(ctrl+f5)标签,那么两个工作线程就会依次响应。 输出结果:
我注意到一件事情。如果我强制刷新(ctrl+f5)标签,那么两个工作线程就会依次响应。
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
我有点困惑在普通刷新(F5)和强制刷新(Ctrl + F5)时发生了什么。帮助我理清楚这个问题...!