そうでない共有グローバルのにもかかわらず、私はあなたがクラスタネイティブモジュールまたは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を参照してください。