Безопасное объективное многопользовательское игровое состояние с несколькими потоками

Я создаю многопользовательскую карточную игру с Python, gevent и django-socketio, и мне интересно, как лучше поддерживать состояние вещей, учитывая, что одновременно будет несколько клиентов, которые будут подключаться и делать что-то.

Я использую Redis как хранилище данных для внутриигровых битов, с легкими объектными моделями сверху (Redisco в mo).

Я беспокоюсь о защите от условий гонки и, следовательно, о сохранении игрового состояния в безопасности и согласии с таким количеством клиентов, которые пытаются сделать что-то одновременно. Я думаю, что мои основные варианты:

(1) - Убедитесь в том, что все операции безопасны, так как более чем один клиент делает что-то одновременно (например, игрок может взаимодействовать только с определенными свойствами своей собственной модели игрока, и существует некоторое объективное игровое состояние через другой поток или что-то, что делает что-либо еще.) (2) - Используйте очередь с некоторой глобальной блокировкой, чтобы гарантировать, что все клиентские операции выполняются в определенном гарантированном порядке, и один завершается до начала следующего.

Я использую Python, Django, django-socketio, gevent, но думаю, что это применимо более широко.

Является ли это "потокобезопасной" вещью, на которую ссылаются люди?

Я полагаю, теоретически, мне кажется, что я предпочитаю идею (1), и я думаю, что могу обеспечить безопасные операции, просто изменяя один ключ Redis за раз, или безопасные наборы атомарных операций, но я думаю, что мне либо понадобится выбрасывать модели Redisco или быть очень осторожным в понимании того, когда что-то будет сохранено и записано. Я думаю, что это хорошо для всего лишь нескольких из нас, работающих над вещами, но это может быть опасно в долгосрочной перспективе, если в кодовой базе будет больше людей.

Спасибо!

1 ответ

Вы описали свои варианты достаточно хорошо. Вероятно, вам нужно объединить оба подхода.

  1. Убедитесь, что у вас как можно меньше общего состояния.
  2. Использовать очередь для внесения изменений в оставшееся общее состояние.
Другие вопросы по тегам