Безопасное объективное многопользовательское игровое состояние с несколькими потоками
Я создаю многопользовательскую карточную игру с Python, gevent и django-socketio, и мне интересно, как лучше поддерживать состояние вещей, учитывая, что одновременно будет несколько клиентов, которые будут подключаться и делать что-то.
Я использую Redis как хранилище данных для внутриигровых битов, с легкими объектными моделями сверху (Redisco в mo).
Я беспокоюсь о защите от условий гонки и, следовательно, о сохранении игрового состояния в безопасности и согласии с таким количеством клиентов, которые пытаются сделать что-то одновременно. Я думаю, что мои основные варианты:
(1) - Убедитесь в том, что все операции безопасны, так как более чем один клиент делает что-то одновременно (например, игрок может взаимодействовать только с определенными свойствами своей собственной модели игрока, и существует некоторое объективное игровое состояние через другой поток или что-то, что делает что-либо еще.) (2) - Используйте очередь с некоторой глобальной блокировкой, чтобы гарантировать, что все клиентские операции выполняются в определенном гарантированном порядке, и один завершается до начала следующего.
Я использую Python, Django, django-socketio, gevent, но думаю, что это применимо более широко.
Является ли это "потокобезопасной" вещью, на которую ссылаются люди?
Я полагаю, теоретически, мне кажется, что я предпочитаю идею (1), и я думаю, что могу обеспечить безопасные операции, просто изменяя один ключ Redis за раз, или безопасные наборы атомарных операций, но я думаю, что мне либо понадобится выбрасывать модели Redisco или быть очень осторожным в понимании того, когда что-то будет сохранено и записано. Я думаю, что это хорошо для всего лишь нескольких из нас, работающих над вещами, но это может быть опасно в долгосрочной перспективе, если в кодовой базе будет больше людей.
Спасибо!
1 ответ
Вы описали свои варианты достаточно хорошо. Вероятно, вам нужно объединить оба подхода.
- Убедитесь, что у вас как можно меньше общего состояния.
- Использовать очередь для внесения изменений в оставшееся общее состояние.