2012-09-06 6 views
6

Also arbeite ich an einem Projekt in Node.js und ich möchte einige zusätzliche Threads öffnen, um die Verarbeitungslast effizienter zu behandeln. Aber ich verwende Klassen mit Funktionsdefinitionen, und wenn ich versuche, diese Objekte an den Worker-Thread zu senden, verschwinden die Funktionen, die im Objekt definiert sind, und mir bleiben nur die anderen Felder im Objekt übrig. Gibt es eine Möglichkeit, dem Arbeiter ein Objekt zu schicken und die Funktionen zu erhalten, damit sie im Arbeiter aufgerufen werden können?Node.js sendet ein Objekt mit Funktionsdefinitionen an Worker-Thread

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

Antwort

2

Nein, es gibt keine Möglichkeit, Funktionen zwischen Threads zu übergeben. Sie können nur JS-normale Objekte (nur Daten) übergeben und sie mit Funktionen behandeln, die im aktuellen Thread definiert sind (z. B. neues Objekt mit empfangenen Daten erstellen).

+2

wow, das die Funktionalität des Clustermoduls wirklich einschränkt. Weißt du, ob es Pläne gibt, das zu Node.js hinzuzufügen? –

+0

Diese Funktionalität steht im Gegensatz zur node.js-Architektur. Node.js Event-Loop funktioniert in einem einzigen Thread. Das Cluster-Modul startet nur neue Prozesse. Sie alle haben ihre eigene unabhängige Erinnerung. Die Implementierung von Multi-Thread-Architekturen muss Threads mit gemeinsamem Speicher und verwandten Mechanismen wie "Mutexe" und "Semaphoren" unterstützen. Dies ist nicht der Weg von node.js. –

2

Charlie, ich weiß, dass du diese Frage vor einem Jahr gestellt hast, aber ich wollte etwas sehr ähnliches machen und ich bin auf deine Frage gestoßen, auf die du noch keine Antwort geschrieben hast. Ich dachte, ich würde einen "Stich" machen und dir zeigen, was ich mit deinem Code gemacht habe. Diese unterschiedliche Art, Code zu organisieren, ist für mich eine sehr akzeptable Problemumgehung in meiner Arbeit von node.js. Ich bin mir ziemlich sicher, dass dies Ihnen einen Weg gibt, das zu erreichen, was Sie wollen, auch wenn Sie es nicht so machen können, wie Sie es wollten.

Erklären Sie Ihre „Klasse“ außerhalb des Clusters Code wie folgt:

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

geben, dass ein Wirbel und sehen, ob dies eine Antwort ist, kann man annehmen!

Verwandte Themen