2017-12-19 3 views
0

ノード内のnpmモジュールを処理し、計算を行う別のファイルにアクセスします。問題は、オンのときです。メッセージイベント/コールバック私はそれが実際に何か確かではないが、私はグローバル変数にアクセスしようとしている、そして、それは未定義であると言う。誰かが良い解答を持つことができれば。コールバックアクセスのグローバルプロセスでの子プロセスnodejs

 _addBlock(newBlock) 
     { 
       newBlock.previousHash = this._getLatestBlock().hash; 
       var child = 
     childProcess.fork('C:\\Users\\Yoana\\WebstormProjects\\ChildProcess\\mining1.js' 
       ); 
       child.on('message', function(newBlock) 
       { 
       // Receive results from child process 
       console.log('received: ' , newBlock); 
       this.chain.push(newBlock); 
      }) 

      // Send child process some work 
      child.send(newBlock); 

    } 

this.chain.pushは定義されていません。 _addBlockメソッドはBlockchainクラスの一部であり、this.chainはグローバルにアクセス可能です。

答えて

2

そうでない共有グローバルのにもかかわらず、私はあなたがクラスタネイティブモジュールまたはchild_process方法によるメッセージなどを渡し、とネイティブモジュールで、すなわちNode.jsのマスタ/ワーカアーキテクチャを使用しているモデルわかりません推奨(共有メモリをどのように処理するかを保護されたメモリをどのように扱うか?)、あなたはこのような方法で行うことができます。

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

、その後、あなたは

this.instance = GlobalBotFactory(); // the shared factory instance 
のような他のファイルでそれを参照することができます

しかし、このアプローチで、それが動作するにもかかわらず、

  • のようないくつかの問題への同時変数の変更を主導した可能性が
  • 共有メモリ破損など
  • リーダ/ライタの問題

ので、私は強くお勧め

/// 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); 
    }); 
} 
ノード clusterに従います。 10

非同期フォークされたプロセスを扱うので、メッセージを渡す部分については注意が必要です。また、node.jsでメッセージが配信される保証はないので、ackロジックが必要です。また、pubsubアプローチを使用することもできます(Redis無料のためにこれを提供します、)hereを確認してください、ここでの方法であなたが

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

あり、これは労働者をforkし、マスタまたは他の労働者からの着信メッセージをリッスンします。しかし、配送ロジックはあなた次第であることに注意してください。 subprocess.sendの詳細については、hereを参照してください。

関連する問題