回调上的子进程访问全局对象nodejs

问题描述 投票:0回答:1

在Node中处理npm模块并访问另一个为我做计算的文件。问题是,当打开时。消息事件/回调我不确定它实际上是什么,但我正在尝试访问全局变量,它说它是未定义的。如果有人可以有一个很好的解释解决方案。

        _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是全局可访问的。

javascript
1个回答
2
投票

我不确定你使用哪种模式,即node.js主/工程架构与集群本机模块或带有消息传递等的child_process本机模块,顺便说一下,尽管共享全局变量,但不推荐使用(如何处理共享内存) ?如何处理受保护的内存?),你可以这样做:

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

然后你可以在其他文件中引用它

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

但是这种方法虽然有效,但可能导致一些问题

  • 并发变量修改
  • 共享内存损坏
  • 读者/作者问题

所以我强烈建议遵循一个节点cluster模块与主/工作方法,然后消息传递:

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

对于消息传递部分要小心,因为你将处理异步分叉进程,并且在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 + '.'});
  }

这将分叉工作人员并监听来自主人或其他工作人员的传入消息。但请记住,交付逻辑取决于您。有关here的更多信息,请参阅subprocess.send

© www.soinside.com 2019 - 2024. All rights reserved.