2017-06-28 2 views
2

In Bezug auf den folgenden Code sollte die Anwendung 4 Arbeiter bei jeder Verbindung Gabel, dann jeder Arbeiter eine Nachricht senden und trennen.Cluster-Ereignismeldung mehrmals aufgerufen

Nach der ersten Verbindung jedoch cluster.on('message') Nachricht inkrementell empfangen.

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

erste Ausgabe:

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

dann

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

und so weiter ...

Ich kann nicht verstehen, warum dies geschieht.

Antwort

3

Ihr Problem ergibt sich aus der Art, wie Sie .ON ("Nachricht", ...) verwenden. Sie registrieren den Listener tatsächlich jedes Mal, wenn Ihr Server angerufen wird.

das ‚Push zu zählen‘ Beweglicher Teil des Zuhörers Anruf aus der API behebt dieses Problem:

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