@User547

Flask, как хранить глобальное состояние между процессами?

Суть такова: пишу простенькую браузерную игру, симулятор покера.
На беке фреймворк Flask, но можно изменить на любой другой, не важно.
По текущему плану состояние игры сохраняется между запросами в оперативной памяти. Кроме этого, в памяти так же необходимо постоянно держать довольно объемную таблицу для быстрого расчета старшинства карточной комбинации.
Очень упрощенно, логика следующая:
1) В классе раздачи есть статический массив идущих сейчас раздач.
2) Каждая раздача - объект с уникальным номером, который при создании запускает в отдельном потоке функцию с логикой самой раздачи.
3) В этой функции крутиться бесконечный цикл с выходом по условию (все игроки сделали ход, ставки уравнялись), на каждой итерации которого проверяется, пришло ли с фронта действие юзера, и если да, выполняется дальнейшая логика и передается ход следующему юзеру.
4) Когда на фронте юзер совершает действие, на бек отправляется номер раздачи, по которому в глобальном массиве раздач находится нужная и в нее отправляется ход юзера, который проверяется в п. 3
Все взаимодействие фронт-бек через вебсокеты.

Пока приложение тестируется на локалхосте, где сервер работает в 1 процесс, все работает как надо. Но в реальных условиях, когда сервер будет запущен в несколько процессов, хранить состояние таким образом в глобальных переменных (ну или статических переменных класса, не важно) уже не получится.

Логика самой игры достаточно сложная, чтобы можно было держать состояние раздачи в БД и восстанавливать при каждом запросе, опять же таблицу для расчета комбинаций загружать в память при каждом запросе полный бред.

Подскажите, как обычно решают такие задачи? Если я все делаю совсем-совсем не так, тоже буду рад услышать)
  • Вопрос задан
  • 1095 просмотров
Пригласить эксперта
Ответы на вопрос 2
@deliro
Совсем-совсем не так. Хранить нужно в какой-то базе. Хочешь в оперативе - храни в Redis'ке.

Логика самой игры достаточно сложная, чтобы можно было держать состояние раздачи в БД и восстанавливать при каждом запросе

Насколько сложная?
Ответ написан
Комментировать
@pcdesign
Можно и в файликах хранить состояния.
Ведь состояния - это ведь просто структура, которую бы десереализовал (и наоборот) с помощью
import pickle
"""
Сохраняем сложнную структуру в файл
"""

favorite_color = {"lion": "yellow", "kitty": "red", "aaa": [0, 1, 2]}
pickle.dump(favorite_color, open("id.txt", "wb"))


"""
Читаем из файла
"""

favorite_color = pickle.load(open("id.txt", "rb"))
print(favorite_color)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы