此代码应在玩家进入游戏时自动连接 但问题是当两个用户同时尝试连接时 - 在这种情况下,第二个用户可以轻松覆盖第一个用户所做的更改('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提供的同行。
答案 0 :(得分: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)
答案 1 :(得分:1)
在Memcache中,INCR操作是原子的,并返回递增的新值。例如,如果将值设置为0,则可以通过递增来乐观地获取锁定。如果你得到1,你可以安全地写一个值。如果你回来2,你应该重试交易。
http://code.google.com/appengine/docs/python/memcache/functions.html
答案 2 :(得分:0)
您的房间列表中需要read/write lock。
答案 3 :(得分:0)