Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NODE.JS访问socket.IO事件处理程序中的共享变量_Node.js_Socket.io - Fatal编程技术网

NODE.JS访问socket.IO事件处理程序中的共享变量

NODE.JS访问socket.IO事件处理程序中的共享变量,node.js,socket.io,Node.js,Socket.io,我正在使用NODE.JS和socket.IO做一个实验性的在线扑克游戏。游戏需要3名玩家加入才能开始。我使用socket.IO来监听加入玩家的连接。每当有3名球员来时,他们将组成一个小组。目前我使用一些共享变量来实现这一点。但是如果有很多玩家同时加入,我担心这会导致同步问题。从代码片段中可以看到,播放器、组、groupNumber、comingPlayer和客户端都在多个“连接”事件处理程序之间共享。因此,当一个事件处理程序被执行,而另一个事件处理程序被V8引擎调度时,它可能会破坏这些共享变量的

我正在使用NODE.JS和socket.IO做一个实验性的在线扑克游戏。游戏需要3名玩家加入才能开始。我使用socket.IO来监听加入玩家的连接。每当有3名球员来时,他们将组成一个小组。目前我使用一些共享变量来实现这一点。但是如果有很多玩家同时加入,我担心这会导致同步问题。从代码片段中可以看到,播放器、组、groupNumber、comingPlayer和客户端都在多个“连接”事件处理程序之间共享。因此,当一个事件处理程序被执行,而另一个事件处理程序被V8引擎调度时,它可能会破坏这些共享变量的状态

我用谷歌做了一些研究,但没有找到令人满意的答案。所以我在这里发帖子,看看是否有专家可以帮助我。提前谢谢

var clients = {}; // {"player1": 1} {"player2": 1} {"player3": 1}
var groups = {};  // {"1": ["player1", "player2", "player3"]
var groupNumber = 1; // the current group number
var comingPlayers = 0; // a temporary variable for the coming players
var players = []; // a temporary array containing the players which have not formed 1 group

socket.on('connection', function(client) {                                                                                                  
    sockets[client.id] = client;
    players.push(client.id);
    clients[client.id] = groupNumber;
    comingPlayers++;
    if (comingPlayers === 3) { // now there are 3 players which can compose 1 group
        groups[groupNumber] = arrayClone(players);
        gamePlay(groupNumber);
        players = [];
        groupNumber++;
        comingPlayers = 0;                                                                       
    }          
}

您显示的代码是原子代码(它将在另一个事件处理程序运行之前完全完成),因此您不应该有任何同步问题。请记住,在节点中,所有用户编写的代码都在单个线程中运行。如果其他人正在尝试连接,它不会打断您的工作。

谢谢。看来我对这个概念理解不深。在我之前的理解中,所有节点主线程代码都在单个线程中运行,但事件处理程序中的回调代码并行运行。然后我有一些问题,即节点的性能是否适合任何生产环境?这意味着,在没有人工干预的情况下,所有HTTP连接都将逐个处理。我知道IO部分将由操作系统异步处理,但我不确定正常计算将花费多少时间。如果对某项操作的运行时间有疑问,请分析它,不要猜测。