Node.js 节点始终使用相同的群集

Node.js 节点始终使用相同的群集,node.js,Node.js,我为cpu的每个线程创建了一个集群,对于每个请求,我等待5秒来响应,打开chrome的几个选项卡并发出请求,但所有请求都由同一个集群处理,并且同步地,在第一个请求保持5秒后,它开始处理第二个请求,依此类推 const cluster = require('cluster') const numCPUs = require('os').cpus().length; if(cluster.isMaster) { for (let i = 0; i < numCPUs; i++) {

我为cpu的每个线程创建了一个集群,对于每个请求,我等待5秒来响应,打开chrome的几个选项卡并发出请求,但所有请求都由同一个集群处理,并且同步地,在第一个请求保持5秒后,它开始处理第二个请求,依此类推

const cluster = require('cluster')
const numCPUs = require('os').cpus().length;

if(cluster.isMaster) {

for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

   cluster.on('exit', (worker, code, signal) => {
    console.log(`Worker ${worker.process.pid} died with code: ${code}, and         
signal: ${signal}`);
    console.log('Starting a new worker');
    cluster.fork();
  });

} else {

const express = require('express')
const app = express();

app.get('/', (req, res) => {
setTimeout(()=>{
    console.log('worker response id: ' + cluster.worker.id)
    res.status(200).end() 
}, 5000)
})
app.listen(3000, ()=>   console.log('Listening with worker',         
cluster.worker.id))

}
const cluster=require('cluster'))
const numpus=require('os').cpus().length;
if(cluster.isMaster){
for(设i=0;i{
log(`Worker${Worker.process.pid}死亡,代码:${code},并且
信号:${signal}`);
log(“启动一个新的工作程序”);
cluster.fork();
});
}否则{
const express=require('express')
常量app=express();
应用程序获取(“/”,(请求,请求)=>{
设置超时(()=>{
console.log('worker response id:'+cluster.worker.id)
资源状态(200).end()
}, 5000)
})
app.listen(3000,()=>console.log('Listening with worker',
cluster.worker.id)
}

@编辑----建议后的代码------

它现在可以工作了,但只有两次,你怎么能在图像上看到,其他时间进程是同步的,只使用一个集群,只使用一次其他集群,我如何更好地控制它

const cluster = require('cluster')
const numCPUs = require('os').cpus().length;

if(cluster.isMaster) {

for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

   cluster.on('exit', (worker, code, signal) => {
    console.log(`Worker ${worker.process.pid} died with code: ${code}, and         
signal: ${signal}`);
    console.log('Starting a new worker');
    cluster.fork();
  });

} else {

const express = require('express')
const app = express();

function sleepSync(ms) {
    let targetTime = Date.now() + ms;
    while (Date.now() < targetTime);
}

app.get('/', (req, res) => {
    sleepSync(5000)
    console.log('worker response id: ' + cluster.worker.id)
    res.status(200).end() 
})
app.listen(3000, ()=>   console.log('Listening with worker', cluster.worker.id))

}
const cluster=require('cluster'))
const numpus=require('os').cpus().length;
if(cluster.isMaster){
for(设i=0;i{
log(`Worker${Worker.process.pid}死亡,代码:${code},并且
信号:${signal}`);
log(“启动一个新的工作程序”);
cluster.fork();
});
}否则{
const express=require('express')
常量app=express();
功能睡眠同步(ms){
让targetTime=Date.now()+ms;
while(Date.now(){
睡眠同步(5000)
console.log('worker response id:'+cluster.worker.id)
资源状态(200).end()
})
app.listen(3000,()=>console.log('Listening with worker',cluster.worker.id))
}

执行设置超时需要几微秒的时间。超时不是繁忙的等待。在工作人员等待的时间内,它可以自由地用于其他任务。因此,它将占用额外的请求,直到5秒连续结束。这是通过节点的

更原始的服务器实现也使用这种技术来实现并行性的概念

若要查看差异,请尝试创建一个繁忙的等待,可能如下所示,并使用它代替
setTimeout

function sleepSync(ms) {
    let targetTime = Date.now() + ms;
    while (Date.now() < targetTime);
}
功能睡眠同步(ms){
让targetTime=Date.now()+ms;
while(Date.now()
执行设置超时需要几微秒的时间。超时不是繁忙的等待。在工作人员等待的时间内,它可以自由地用于其他任务。因此,它将占用额外的请求,直到5秒连续结束。这是通过节点的

更原始的服务器实现也使用这种技术来实现并行性的概念

若要查看差异,请尝试创建一个繁忙的等待,可能如下所示,并使用它代替
setTimeout

function sleepSync(ms) {
    let targetTime = Date.now() + ms;
    while (Date.now() < targetTime);
}
功能睡眠同步(ms){
让targetTime=Date.now()+ms;
while(Date.now()
您还可以使用async/Wait,避免繁忙等待和不必要地将一个CPU内核固定5秒钟:

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

app.get('/', async (req, res) => {
    await sleep(5000);
    console.log('worker response id: ' + cluster.worker.id)
    res.status(200).end() 
});
要理解为什么忙等待是不好的,请在应用程序在这5秒钟内循环运行时运行
top
,查看其中一个CPU内核是否处于100%。替换为上述代码,以确认CPU不再受影响

调用
wait
时,Node.js知道必须暂停函数执行,直到
sleep()
的承诺得到解决。同时,它还可以运行其他东西:其他计时器、其他传入的HTTP请求等等


Node.js是单线程的,因此如果您忙着等待,Node.js将无法运行其他任何东西,并且您的程序将被有效地暂停5秒钟,直到循环结束。

您还可以使用async/wait,避免忙着等待和不必要地将一个CPU内核固定5秒钟:

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

app.get('/', async (req, res) => {
    await sleep(5000);
    console.log('worker response id: ' + cluster.worker.id)
    res.status(200).end() 
});
要理解为什么忙等待是不好的,请在应用程序在这5秒钟内循环运行时运行
top
,查看其中一个CPU内核是否处于100%。替换为上述代码,以确认CPU不再受影响

调用
wait
时,Node.js知道必须暂停函数执行,直到
sleep()
的承诺得到解决。同时,它还可以运行其他东西:其他计时器、其他传入的HTTP请求等等


Node.js是单线程的,因此如果您忙于等待,Node.js将无法运行其他任何东西,您的程序将被有效地暂停5秒钟,直到循环结束。

非常感谢,代码现在可以工作了,但并不完美,它只工作了两次,您知道我如何更好地控制它吗?我正在用你的建议更新我的问题,这很难说。不太可能有编译器优化来识别模式并自动将其转换为隐式超时。唯一能绝对确定的方法是创建实际的计算工作。另外,我对使用集群的express了解不够。有一些黑魔法发生在普通人看不见的地方。我想说你问题的解决取决于你明确的目标?我的目标只是为了学习。非常感谢,你给我解释得很好,非常感谢,代码现在可以运行了,但并不完美,它只运行了两次,你知道我如何更好地控制它吗?我正在用你的建议更新我的问题,这很难说。不太可能有适当的编译器优化来记录