2016-07-26 28 views
0

Ich habe ein Problem beim Bereitstellen der gleichen Module oder Objekte zu meinem Child-Prozess. Da es keine Möglichkeit gibt, ein normales Objekt an meinen Child-Prozess zu senden (ich kann nur den "Server", einen Socket oder ein JSON-Objekt senden), habe ich versucht, ein Modul zu erstellen, das ich in meiner Hauptapp.js benötige , setze alle notwendigen Daten darauf, und als in meinem Kindprozess würde ich es auch benötigen.Node.js - Erfordern dasselbe Modul in Child-Prozess

Das Problem ist, dass ich in meinem Child-Prozess ein anderes Objekt erhalte, nicht das, das ich in meiner app.js erstellt habe. Ich habe versucht, ein einfaches Objekt verwendet wird, und eine Eigenschaft auf sie einstellt, sowie eine Funktion ...

//module file 
var Data = function(){ 
    this.data = null; 

    return this; 
}; 

module.exports = Data; 

... dass ich so benutzen ...

//app.js 
var module = require("moduleName")(); 
module.data = "something"; 

... aber in meinem Kind Prozess, Daten noch null

//Child process 
var module = require("moduleName")(); 
console.log(module.data); --> null 

Beide Dateien (app.js und die Datei des Child-Prozess) sind im selben Projekt, und das Verzeichnis.

Meine einzige gues ist, weil ich mit fork() meinem Kind Prozess erstellt, könnte es einen anderen Cache für Module ...

So ist es eine Möglichkeit, mit Hilfe kann ich, immer das gleiche Objekt in meinem Kind Prozess erreichen oder gibt es eine Möglichkeit, ein Objekt (nicht JSON) an meinen Child-Prozess zu senden?

Vielen Dank im Voraus!

Antwort

2

Der Kindprozess und der Elternprozess sind unterschiedliche Prozesse - sie teilen keinen Speicher.

Sie müssen entweder eine Interprozesskommunikation zwischen ihnen verwenden, um die Daten zu synchronisieren, oder einen gemeinsamen Dienst wie Redis verwenden, den der gesamte Prozess verwenden würde.

Die Art, wie Sie gerade versuchen, ist nicht möglich, nicht nur in Node. Beliebige zwei Prozesse haben ihren eigenen Speicher und alles, was sie zwischen sich senden, wird nicht geteilt oder von selbst synchronisiert.

Ohne einen Dienst wie Redis zu verwenden, können Sie mit Ihren Prozessen kommunizieren, indem Sie Nachrichten senden.

Wenn child ist ein Verweis auf Ihr Kind Prozess in Sie übergeordneten Prozess, dann können Sie Nachrichten senden mit:

child.send({some:"object"}); 

In Ihrem Kind können Sie für diese Nachrichten hören mit:

process.on('message', function(object) { 
    // do something with object 
    // like update your local copy 
}); 

Auf diese Weise könnte der übergeordnete Prozess alle seine untergeordneten Prozesse bei jeder Änderung des Objekts benachrichtigen und ihnen eine neue Kopie senden.

Weitere Informationen:

+0

Danke für die schnelle Antwort! Ich benutze bereits eine Kommunikationsleitung zwischen den beiden, aber die Art, wie ich erwähnt habe, wäre ein bisschen einfacher gewesen. :-) Jedenfalls bleibe ich dabei, jetzt ist klar, dass ich das nicht erreichen kann. – Dave

+0

@ Dave ich eine Antwort mit einer Art und Weise aktualisiert Kindprozesse zu informieren, dass ein Objekt geändert hat und sie neue Daten jedes Mal zu senden. Sie könnten auch andersherum gehen und Daten vom Kindprozess zum Elternteil senden. – rsp

+0

Ja, ich bin schon mit diesem Ansatz, aber ich dachte, dass, wenn ich dort eine Menge Kommunikation zwischen dem Haupt ist, und das Kind Prozess, über die Sende- und Combo (und vor allem, weil es nur einen Kanal, den Sie mit Verwenden Sie), könnte es den Kindprozess verlangsamen, aber es ist nur eine Vermutung. Deshalb habe ich ein paar Dinge in der Kind-Prozess (die bereits im Einsatz sind in meinem app.js) enthalten wollte, so konnte ich ein paar andere Kanäle (wie mit dem socket.io liefern, die ich bereits in meiner App feuert. js) – Dave