Node.js 节点始终使用相同的群集
我为cpu的每个线程创建了一个集群,对于每个请求,我等待5秒来响应,打开chrome的几个选项卡并发出请求,但所有请求都由同一个集群处理,并且同步地,在第一个请求保持5秒后,它开始处理第二个请求,依此类推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++) {
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了解不够。有一些黑魔法发生在普通人看不见的地方。我想说你问题的解决取决于你明确的目标?我的目标只是为了学习。非常感谢,你给我解释得很好,非常感谢,代码现在可以运行了,但并不完美,它只运行了两次,你知道我如何更好地控制它吗?我正在用你的建议更新我的问题,这很难说。不太可能有适当的编译器优化来记录