2012-10-05 3 views
1

NODE.JS와 socket.IO를 사용하여 실험적인 온라인 포커 게임을하고 있습니다. 게임을 시작하려면 3 명이 참여해야합니다. 나는 socket.IO를 사용하여 합류하는 선수들의 연결을 듣는다. 3 명이 올 때마다 하나의 그룹을 형성하게됩니다. 현재이 작업을 수행하기 위해 일부 공유 변수를 사용합니다. 하지만 동시에 많은 플레이어가 들어오는 경우 동기화 문제가 발생할 수 있습니다. 코드 스 니펫에서 볼 수 있듯이 players, groups, groupNumber, comingPlayer, clients는 모두 여러 'connection'이벤트 핸들러간에 공유됩니다. 따라서 하나의 이벤트 핸들러가 실행되고 다른 이벤트 핸들러가 V8 엔진에 의해 스케줄 된 경우, 이러한 공유 변수의 상태가 손상 될 수 있습니다.NODE.JS socket.IO 이벤트 핸들러에서 공유 변수에 액세스하기

Google을 사용하여 조사했지만 만족스러운 답변을 찾지 못했습니다. 그래서 전문가가 도와 줄 수 있는지 여기에 게시했습니다. 미리 감사드립니다!

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

답변

0

표시 한 코드는 다른 이벤트 처리기를 실행하기 전에 완전히 완료되므로 동기화 문제가 없어야합니다. 노드에서 모든 사용자 작성 코드는 단일 스레드에서 실행된다는 점을 기억하십시오. 다른 사람이 연결하려고 시도하면 방해를받지 않습니다.

+0

감사합니다. 이 개념을 깊이 이해하지 못했던 것 같습니다. 이전의 이해에서 모든 노드 주 스레드 코드는 단일 스레드에서 실행되지만 이벤트 핸들러의 콜백 코드는 병렬로 실행됩니다. 그렇다면 어떤 생산 환경에 적합한 NODE의 성능에 대한 우려가 있습니까? 즉, 수동 개입없이 모든 HTTP 연결이 하나씩 처리됩니다. 입출력 부분이 비동기 적으로 OS에 의해 처리 될 것이라는 것을 알고 있지만 정상적인 계산에 소요되는 시간이 어느 정도인지 확신 할 수 없습니다. – EricCui

+0

무언가가 얼마나 오래 실행되는지에 대해 의심스러워 할 때 추측하지 마십시오. – ebohlman

관련 문제