在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是全局可访问的。
答案 0 :(得分:2)
我不确定您使用的是哪种型号,即带有 cluster 本机模块的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 + '.'});
}
这将分叉工作人员并监听来自主人或其他工作人员的传入消息。但请记住,交付逻辑取决于您。有关subprocess.send
的详细信息,请参阅here。