2012-09-06 6 views
6

Estoy trabajando en un proyecto en Node.js y quiero abrir algunos hilos adicionales para manejar la carga de procesamiento de manera más eficiente. Pero estoy usando clases con definiciones de función con ellos y cuando intento enviar esos objetos al hilo de trabajo, las funciones definidas en el objeto desaparecen y solo me quedan los otros campos en el objeto. ¿Hay alguna manera de enviar un objeto al trabajador y conservar las funciones para que puedan ser llamadas dentro del trabajador?Node.js enviando un objeto con definiciones de función al hilo de trabajo

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

Respuesta

2

No, no hay forma de pasar funciones entre subprocesos. Puede pasar solo objetos planos JS (solo datos) y manejarlo con funciones definidas en el hilo actual (como crear un nuevo objeto con los datos recibidos).

+2

guau que realmente limita la funcionalidad del módulo de clúster. ¿Sabes si hay planes para agregar eso a Node.js? –

+0

Esta funcionalidad es contraria a la arquitectura node.js. El bucle de evento Node.js funciona en un solo hilo. El módulo de clúster simplemente comienza nuevos procesos. Todos ellos tienen su propia memoria independiente. La implementación de arquitecturas de subprocesos múltiples debe admitir subprocesos con memoria compartida y mecanismos relacionados, como 'mutexes' y' semáforos'. Esta no es la forma de node.js. –

2

Charlie, me doy cuenta de que hizo esta pregunta hace un año, pero quería hacer algo muy similar y me encontré con su pregunta que todavía no marcaba una respuesta. Pensé que podría darle una "puñalada" y mostrarle lo que hice con su código. Esta forma diferente de organizar el código es para mí una solución muy aceptable en mi trabajo node.js. Estoy bastante seguro de que esto te brinda la manera de lograr lo que deseas, aunque no puedas hacerlo de la manera que deseas.

declaran su "clase" fuera del código de clúster, como esto:

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

Dale que un torbellino y ver si esto es una respuesta que puede aceptar!

Cuestiones relacionadas