NodeJS Cluster 如何在工作人员之间共享对象数组
NodeJS Cluster how share object array across workers
所以我已经设置了一个简单的 nodejs 集群游戏,我是 nodejs 的新手。基本上,玩家使用 socket.io 连接到我的工作人员,然后他们被创建到玩家对象,然后添加到我的 PlayerManager.LIST 数组。现在这给我带来了一些问题,因为 PlayerManager.LIST 在每个工人身上并且没有同步。
所以我的问题是,是否有更好的方法可以让我连接到工人 2 时看到与工人 1 相同的玩家列表。
目前结构:
app.js
-> worker
->-> PlayerManager (Contains List)
->->-> Player
NodeJS 集群基于 Nodejs 子进程。在子进程中,您可以通过 IPC 通道上的消息在父进程(集群中的 Master)和子进程(集群中的 worker)之间发送数据。您可以使用消息事件对集群执行相同的操作
var cluster = require('cluster');
var _ = require('lodash');
var http = require('http');
var workers = [];
var workerCount = 4;
if (cluster.isMaster) {
for (var i = 0; i < workerCount; i++) {
var worker = cluster.fork();
worker.on('message', function(msg) {
if (msg.task === 'sync') {
syncPlayerList(msg.data);
}
});
}
workers.push[worker];
} else {
var worker = new Worker();
process.on('message', function(msg) {
if (msg.task === 'sync') {
worker.playerList = msg.data;
}
});
}
function syncPlayerList (playerList) {
_.forEach(workers, function (worker) {
worker.send({
task: 'sync',
data: playerList
});
});
};
// worker class
function Worker() {
this.playerList = [];
}
Worker.prototype.sendSyncEvent = function () {
process.send({
task: 'sync',
data: this.playerList
})
};
所以我已经设置了一个简单的 nodejs 集群游戏,我是 nodejs 的新手。基本上,玩家使用 socket.io 连接到我的工作人员,然后他们被创建到玩家对象,然后添加到我的 PlayerManager.LIST 数组。现在这给我带来了一些问题,因为 PlayerManager.LIST 在每个工人身上并且没有同步。
所以我的问题是,是否有更好的方法可以让我连接到工人 2 时看到与工人 1 相同的玩家列表。
目前结构:
app.js
-> worker
->-> PlayerManager (Contains List)
->->-> Player
NodeJS 集群基于 Nodejs 子进程。在子进程中,您可以通过 IPC 通道上的消息在父进程(集群中的 Master)和子进程(集群中的 worker)之间发送数据。您可以使用消息事件对集群执行相同的操作
var cluster = require('cluster');
var _ = require('lodash');
var http = require('http');
var workers = [];
var workerCount = 4;
if (cluster.isMaster) {
for (var i = 0; i < workerCount; i++) {
var worker = cluster.fork();
worker.on('message', function(msg) {
if (msg.task === 'sync') {
syncPlayerList(msg.data);
}
});
}
workers.push[worker];
} else {
var worker = new Worker();
process.on('message', function(msg) {
if (msg.task === 'sync') {
worker.playerList = msg.data;
}
});
}
function syncPlayerList (playerList) {
_.forEach(workers, function (worker) {
worker.send({
task: 'sync',
data: playerList
});
});
};
// worker class
function Worker() {
this.playerList = [];
}
Worker.prototype.sendSyncEvent = function () {
process.send({
task: 'sync',
data: this.playerList
})
};