我创建了运行很少工作程序的集群管理器。他们都在工作,但经理几乎只将全部工作委托给一名工人。
这是代码:
const cluster = require('cluster');
if(cluster.isMaster){
console.log('Master is running: %d', cluster.isMaster);
var cpuCount = require('os').cpus().length;
console.log('Amount of CPU: %d', cpuCount);
// Create a worker for each CPU
for (var i = 0; i < cpuCount; i += 1) {
cluster.fork();
}
cluster.on('exit', function (worker) {
// Replace the dead worker, we're not sentimental
console.log('Worker %d died!', worker.id);
cluster.fork();
});
} else {
const express = require('express');
const app = express();
function doWork(duration){
const start = Date.now();
while(Date.now() - start < duration){}
}
app.get('/', (req, res) => {
console.log('Request that takes 10s to worker %d', cluster.worker.id);
doWork(10000);
res.send('it was slow');
} );
app.get('/fast', (req, res) => {
console.log('Normal Request to worker %d', cluster.worker.id);
res.send('it was fast');
})
app.listen(3000);
console.log('Worker %d running!', cluster.worker.id);
}
cmd的输出:
Master is running: 1
Amount of CPU: 4
Worker 1 running!
Worker 2 running!
Worker 3 running!
Worker 4 running!
Request that takes 10s to worker 4
Normal Request to worker 4
Request that takes 10s to worker 4
Normal Request to worker 4
Request that takes 10s to worker 4
Normal Request to worker 3
Normal Request to worker 4
在输出的第一部分中,您看到运行'node index.js'后,所有内容都已初始化。
之后,我打开了带有两个选项卡的浏览器。在第一个选项卡中,我打开了“ localhost:3000 /”,然后在第二个选项卡“ localhost:3000 / fast /”中非常快速地打开了它。结果位于输出的第二部分。您如何看待集群管理器将工作委派给同一工作人员。
我重复了这个过程,结果是一样的-您在第三部分中看到了。
在最后一步中,我执行了相同的操作,但是我对URL'localhost:3000 / fast /'按下了两次(一个接一个)。第一次单击工作后,您看到的是同一工作人员,但随后再次按到另一工作人员后,您看到的结果。
为什么这样工作?为什么集群管理器没有将工作委派给当时未使用的工人,而是委派给忙碌的同一个人?如何更改此代码以更有效地工作。
感谢您的回复。