2012-09-06 6 views
6

Quindi sto lavorando su un progetto in Node.js e voglio aprire alcuni thread aggiuntivi per gestire il carico di elaborazione in modo più efficiente. Ma sto usando classi con definizioni di funzioni con esse e quando provo a inviare quegli oggetti al thread worker, le funzioni definite nell'oggetto scompaiono e mi rimangono solo gli altri campi nell'oggetto. C'è un modo per inviare al lavoratore un oggetto e preservare le funzioni in modo che possano essere chiamate all'interno del lavoratore?Node.js che invia un oggetto con definizioni di funzione al thread di lavoro

var cluster = require('cluster'); 

if(cluster.isMaster){ 
    Monster = function(species){ 
     this.attack = function(){ 
      console.log('CHOMP'); 
     }; 
     this.name = species; 
    }; 
    var vamp = new Monster('vampire'), 
    worker = cluster.fork(); 
    worker.send({'monster' : vamp}); 
    } 
else{ 
    process.on('message', function(msg) { 
     console.log(msg.monster); //this logs "{ name: 'vampire' }" 
     msg.monster.attack(); //TypeError: Object #<Object> has no method 'attack' 
    }); 
} 

risposta

2

No, non è possibile passare le funzioni tra i thread. È possibile passare solo oggetti plain JS (solo dati) e gestirli con funzioni definite nel thread corrente (come creare un nuovo oggetto con i dati ricevuti).

+2

wow che limita davvero la funzionalità del modulo cluster. Sai se ci sono piani per aggiungerlo a Node.js? –

+0

Questa funzionalità è contraria all'architettura node.js. Il ciclo di eventi Node.js funziona in un singolo thread. Il modulo cluster avvia solo nuovi processi. Hanno tutti una memoria indipendente. L'implementazione di architetture multi-threaded deve supportare thread con memoria condivisa e meccanismi correlati come 'mutexes 'e' semaphores'. Questo non è il modo node.js. –

2

Charlie, mi rendo conto che hai fatto questa domanda un anno fa, ma volevo fare qualcosa di molto simile e ho trovato la tua domanda a cui non hai ancora risposto. Ho pensato di prenderne una "pugnalata" e mostrarti cosa ho fatto con il tuo codice. Questo diverso modo di organizzare il codice è per me una soluzione accettabile nel mio lavoro node.js. Sono abbastanza sicuro che questo ti dà un modo per realizzare ciò che vuoi, anche se non puoi farlo nel modo che volevi.

dichiarare il vostro "classe" al di fuori del codice di cluster, in questo modo:

var cluster = require('cluster'); 

var Monster = function(species){ 
    this.attack = function(){ 
     console.log('CHOMP!'); 
    }; 
    this.die = function() { 
     console.log("Oh, what did I eat? I don't feel so good....\r\n"); 
     process.exit(0); 
    }; 
    this.scare = function() { 
     console.log("BOO! I am a " + this.name + "!"); 
    }; 
    this.name = species; 
}; 

if(cluster.isMaster){ 
    worker = cluster.fork(); 
    worker.send({'species' : 'Vampire'}); 
} 
else{ 
    process.on('message', function(msg) { 
     if(typeof msg.species !== "undefined") { 
      myMonster = new Monster(msg.species); 
      myMonster.scare(); 
      myMonster.attack(); 
      myMonster.die(); 
     } 
    }); 
} 

dare quella un vortice e vedere se questa è una risposta si può accettare!

Problemi correlati