2010-06-07 21 views
0

此代碼應該在玩家進入遊戲時自動連接。
但問題是兩個用戶同時嘗試連接 - 在這種情況下,第二個用戶可以輕鬆地覆蓋第一個用戶('room_1'變量)所做的更改。閱讀 - >更改 - >保存。線程安全

我怎麼能使它線程安全?

 
def join(userId): 
    users = memcache.get('room_1') 
    users.append(userId) 
    memcache.set('room_1', users) 
    return users 

我使用的是Google App Engine(python),並將實現簡單的遊戲服務器來交換由Adobe Stratus提供的同伴。

回答

2

這樣的事情可能工作。

class Room(db.Model): 
    users = db.StringListProperty() 

def join(userId): 
    def _transaction(): 
     room = Room.get_by_key_name('room_1') 
     if room is None: 
      room = Room(key_name = 'room_1', users = []) 
     room.users.append(userId) 
     room.put() 
     return room.users 
    return db.run_in_transaction(_transaction) 
+0

哇!謝謝!我不知道「run_in_transaction」:) – 2010-06-08 10:46:34

0

memcache僅僅是一個緩存,並且它通常不適合原子數據存儲,這正是您嘗試使用它的原因。我建議使用GAE數據存儲,而不是這種問題。

+0

是的,但如果我切換到數據存儲,問題仍然存在。 GAE不能以原子方式「讀取 - 保存」。唯一的方法是獲取用戶,追加新用戶,然後將其放回數據存儲。 – 2010-06-07 17:44:31

+1

GAE的特色交易是爲您提供所需的原子性。 db.run_in_transaction()應該允許你以原子方式運行你的join()函數。 – Kylotan 2010-06-08 09:32:26