2017-12-19 22 views
0

Prozess Npm-Modul in Node und Zugriff auf eine andere Datei, die Berechnungen für mich ausführt. Das Problem ist, dass wenn eingeschaltet. Message Event/Callback Ich bin mir nicht sicher, was es eigentlich ist, aber da ich versuche, auf globale Variable zuzugreifen und es sagt, es ist undefiniert. Wenn jemand eine gut erklärte Lösung haben kann.Kind-Prozess bei Callback-Zugriff globales Objekt Nodejs

Es besagt, dass this.chain.push nicht definiert ist. Die Methode _addBlock ist Teil einer Klasse Blockchain und this.chain ist global zugänglich.

Antwort

2

Ich bin nicht sicher, welches Modell Sie sind mit dh node.js Master/Arbeiter Architektur mit Cluster nativen Modul oder child_process nativen Modul mit Nachricht usw. vorbei, übrigens trotz des Teilens Globals ist es nicht empfohlen (? wie den gemeinsamen Speicher zu handhaben, wie geschützten Speicher zu handhaben), können Sie auf diese Weise tun:

global.GlobalBotFactory = function() { 
     if (typeof(instance)=="undefined") 
      instance = new MyClass(options); 
     return instance; 
    } 

und dann können Sie es auch in anderen Dateien wie

this.instance = GlobalBotFactory(); // the shared factory instance 
Referenz

Aber dieser Ansatz, obwohl es funktioniert, führte könnte zu mehreren Themen wie

  • gleichzeitige variable Änderung
  • Shared-Memory-Korruption
  • Leser/Schreiber Problem

usw. so stark ich vorschlagen einem Knoten cluster Modul mit Master/Worker-Ansatz folgen und dann Nachricht übergeben:

/// node clustering 
const cluster = require('cluster'); 
const numCPUs = require('os').cpus().length; 

if (cluster.isMaster) { // master node 
    var masterConfig=require('./config/masterconfig.json'); 

    // Fork workers. 
    var maxCPUs = masterConfig.cluster.worker.num; 
    maxCPUs=(maxCPUs>=numCPUs)?numCPUs:maxCPUs; 

    for (let i = 0; i < maxCPUs; i++) { 
     const worker=cluster.fork(); 
    } 

    var MasterNode=require('./lib/master'); 
    var master= new MasterNode(masterConfig); 
    master.start() 
    .then(done=> { 
     console.log(`Master ${process.pid} running on ${masterConfig.pubsub.node}`); 
    }) 
    .catch(error=> { 
     console.error(`Master ${process.pid} error`,error); 
    }); 
} 
else if (cluster.isWorker) { // worker node 
    var workerConfig=require('./config/workerconfig.json'); 
    var WorkerNode=require('./lib/worker'); 
    var worker= new WorkerNode(workerConfig); 
    worker.start() 
    .then(done=> { 
     console.log(`Worker ${process.pid} running on ${workerConfig.pubsub.node}`); 
    }) 
    .catch(error=> { 
     console.error(`Worker ${process.pid} error`,error); 
    }); 
} 

Für den Nachrichtenübergabe-Teil müssen Sie vorsichtig sein, da Sie mit asynchronen gegabelten Prozessen arbeiten, und in node.js gibt es keine Garantie, dass eine Nachricht zugestellt wird, so dass Sie eine ack-Logik benötigen oder eine pubsub-Methode verwenden können (Redis bietet dies für eingehende Nachrichten vom Master oder anderen Arbeitnehmern frei, überprüfen Sie bitte here), übrigens hier sind Sie

for (var i = 0; i < 2; i++) { 
    var worker = cluster.fork(); 

    // Receive messages from this worker and handle them in the master process. 
    worker.on('message', function(msg) { 
     console.log('Master ' + process.pid + ' received message from worker ' + this.pid + '.', msg); 
    }); 

    // Send a message from the master process to the worker. 
    worker.send({msgFromMaster: 'This is from master ' + process.pid + ' to worker ' + worker.pid + '.'}); 
    } 

dies den Arbeiter Gabel wird und hören. Aber denken Sie daran, dass die Lieferlogik Ihnen überlassen ist. Siehe here für weitere Informationen über subprocess.send.