代码之家  ›  专栏  ›  技术社区  ›  Jérôme

多次调用群集事件消息

  •  3
  • Jérôme  · 技术社区  · 8 年前

    关于以下代码,应用程序应该在每个连接处分叉4个工作线程,然后每个工作线程发送一条消息并断开连接。

    cluster.on('message')

    const express = require('express');
    const cluster = require('cluster');
    
    if (cluster.isMaster) {
      const app = express();
      app.get('/', (req, res) => {
        [1, 2, 3, 4].map(() => cluster.fork());
    
        const count = [];
        cluster.on('message', (worker, message) => {
          console.log({
            worker: worker.id,
            message
          });
          count.push(true);
          if (count.length === 4)
            return res.sendStatus(200);
        });
      });
      app.listen(8000, () => console.log('listening on 8000'));
    } else if (cluster.isWorker) {
      process.send('msg');
      process.disconnect();
    }
    

    第一输出:

    > curl localhost:8000
    > { worker: 4, message: 'msg' }
    > { worker: 1, message: 'msg' }
    > { worker: 2, message: 'msg' }
    > { worker: 3, message: 'msg' }
    

    然后

    > curl localhost:8000
    { worker: 5, message: 'msg' }
    { worker: 5, message: 'msg' }
    { worker: 8, message: 'msg' }
    { worker: 8, message: 'msg' }
    { worker: 7, message: 'msg' }
    { worker: 7, message: 'msg' }
    { worker: 6, message: 'msg' }
    { worker: 6, message: 'msg' }
    

    我不明白为什么会这样。

    1 回复  |  直到 8 年前
        1
  •  4
  •   Pampattitude    8 年前

    您的问题源于您使用的方式。on(“message”,…)。实际上,每次调用服务器时,您都在注册侦听器。

    if (cluster.isMaster) {
      let count = [];
      cluster.on('message', (worker, message) => {
        console.log({
          worker: worker.id,
          message
        });
        count.push(true);
      });
    
      const app = express();
      app.get('/', (req, res) => {
        [1, 2, 3, 4].forEach(() => cluster.fork());
    
        let msgHandler = (worker, message) => {
          if (count.length === 4) {
            cluster.removeListener('message', msgHandler); // Do not forget to remove this event listener, or the issue will arise again!
            count.length = 0;
            return res.sendStatus(200);
          }
        };
    
        cluster.on('message', msgHandler);
      });
      app.listen(10101, () => console.log('listening on 10101'));
    } else if (cluster.isWorker) {
      process.send('msg');
      process.disconnect();
    }