Django — gunicorn — переменная уровня приложения (общая для рабочих)

Итак, у меня есть игрушечный проект django + gunicorn. Я хочу иметь довольно большую статистическую модель, загружаемую в память только один раз, а затем повторно использовать ее в рабочих/потоках.

Как/где определить переменную уровня приложения? Пробовал ставить на settings.py, а также на wsgi.py


person David Przybilla    schedule 08.05.2015    source источник
comment
Так что же произошло, когда вы попробовали это?   -  person Daniel Roseman    schedule 09.05.2015
comment
к переменной можно получить доступ через все приложение, но есть одна переменная для каждого работника, а не один единственный экземпляр (singleton). Есть подсказки?   -  person David Przybilla    schedule 11.05.2015


Ответы (1)


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

Вы можете поместить «модель» (что делает ее большой?) в БД Redis и оттуда получить к ней доступ в каждом рабочем процессе. Лучшим вариантом, вероятно, будет создание отдельной службы, из которой вы запускаете один экземпляр, и общаетесь с ней через HTTP или RPC от вашего воркера (посмотрите на nameko для простой структуры (микро)сервисов.

Другой вариант — использовать одного работника Celery и выполнять статистические расчеты в задаче.

person Tino    schedule 09.12.2016