代码之家  ›  专栏  ›  技术社区  ›  Davi Resio

节点始终使用相同的群集

  •  0
  • Davi Resio  · 技术社区  · 7 年前

    我为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))
    
    }
    

    enter image description here

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

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

    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))
    
    }
    

    enter image description here

    2 回复  |  直到 7 年前
        1
  •  2
  •   Kiruse    7 年前

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

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

    为了看到不同之处,尝试创建一个繁忙的等待,可能如下所示,并使用它代替 设置超时 .

    function sleepSync(ms) {
        let targetTime = Date.now() + ms;
        while (Date.now() < targetTime);
    }
    
        2
  •  1
  •   Lucio Paiva    7 年前

    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() 
    });
    

    要理解为什么忙碌等待是不好的,请运行 top 当你的应用程序在这5秒内循环时,你会发现你的一个CPU核心是100%。替换为上述代码,以确认CPU不再受影响。

    当你打电话的时候 await ,Node.js知道它必须暂停函数的执行,直到得到承诺 sleep() 问题解决了。同时,它还可以运行其他东西:其他计时器、其他传入的HTTP请求等等。

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

    推荐文章