阅读 - >改变 - >保存。线程安全

时间:2010-06-07 06:18:34

标签: python google-app-engine thread-safety

此代码应在玩家进入游戏时自动连接 但问题是当两个用户同时尝试连接时 - 在这种情况下,第二个用户可以轻松覆盖第一个用户所做的更改('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提供的同行。

4 个答案:

答案 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)

memcache是​​'只是'一个缓存,并且以其通常的形式,它不适合原子数据存储,这是你正在尝试使用它。我建议使用GAE数据存储区,它专为此类问题而设计。