Я немного запутался в функции мультипроцесса mod_wsgi и об общем дизайне WSGI-приложений, которые будут выполняться на серверах WSGI с возможностью многопроцессорности.
Рассмотрим следующую директиву:
WSGIDaemonProcess example processes=5 threads=1
Если я правильно понимаю, mod_wsgi будет порождать 5 процессов Python (например, CPython), и любой из этих процессов может получить запрос от пользователя.
В документации указано, что:
Если общие данные должны быть видимыми для всех экземпляров приложения, независимо от того, какой дочерний процесс они выполняются, и изменений, внесенных в данные одним приложением немедленно доступны для другого, включая любое выполнение в другом дочернем процессе, внешние данные таких как база данных или разделяемая память. Глобальный переменные в обычных модулях Python не могут использоваться для этой цели.
Но в этом случае становится очень тяжело, когда нужно быть уверенным, что приложение работает в любых условиях WSGI (включая многопроцессорные).
Например, простая переменная, которая содержит текущее количество подключенных пользователей, должна ли она быть безопасна в процессе чтения/записи из/в memcached или в БД или (если такие механизмы вне стандартной библиотеки доступная) общая память?
И будет ли код вроде
counter = 0
@app.route('/login')
def login():
...
counter += 1
...
@app.route('/logout')
def logout():
...
counter -= 1
...
@app.route('/show_users_count')
def show_users_count():
return counter
ведут себя непредсказуемо в многопроцессорной среде?
Спасибо!