2012-10-05 65 views
1

我正在做一個使用NODE.JS和socket.IO的實驗性在線撲克遊戲。該遊戲需要3名玩家加入才能開始。我使用socket.IO來收聽加入玩家的連接。每當有三名球員進入時,他們將組成一個組。目前我使用一些共享變量來做到這一點。但是如果有很多玩家同時進來,我擔心它會引起同步問題。從代碼片段中可以看到,玩家,組,groupNumber,comingPlayer,客戶端都是在多個「連接」事件處理程序之間共享的。所以,當一個事件處理程序被執行並且另一個事件處理程序被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連接都將被逐個處理。我知道IO部分將由操作系統異步處理,但我不知道正常計算花費多少時間。 – EricCui

+0

如果對運行時間有疑問,請對其進行分析,不要猜測。 – ebohlman

相關問題