2010-06-07 19 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