Читать -> изменить -> сохранить. Поток безопасно - PullRequest
0 голосов
/ 07 июня 2010

Этот код должен автоматически соединять игроков при входе в игру.
Но проблема в том, что два пользователя пытаются подключиться одновременно - в этом случае второй пользователь может легко перезаписать изменения, сделанные первым пользователем ('room_1'переменная).

Как сделать потокобезопасным?</p> <pre> def join(userId): users = memcache.get('room_1') users.append(userId) memcache.set('room_1', users) return users </pre> <p>

Я использую Google App Engine (python) и собираюсь реализовать простой игровой сервер для обмена пирами, предоставленными Adobe Stratus.

Ответы [ 4 ]

2 голосов
/ 08 июня 2010

Нечто подобное может работать.

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 голос
/ 08 июня 2010

В Memcache операция INCR является атомарной и возвращает новое значение с приращением. Например, если значение установлено в 0, вы можете получить блокировку оптимистично, увеличивая ее. Если вы получите 1, вы можете смело написать значение. Если вы получите обратно 2, вы должны повторить транзакцию.

http://code.google.com/appengine/docs/python/memcache/functions.html

0 голосов
/ 07 июня 2010

memcache - это «просто» кеш, и в обычном виде он не подходит для атомарного хранилища данных, для которого вы пытаетесь его использовать.Вместо этого я бы предложил использовать хранилище данных GAE, предназначенное для такого рода проблем.

0 голосов
/ 07 июня 2010

Вам нужен замок для чтения / записи в ваших списках номеров.

...