У меня есть следующая реализация кода:
- Python 3
- SQLAlchemy
- Postgres
Для тестирования Цели БД и App находятся на одном сервере. Apache работает со следующим MPM: серверное MPM: многопоточное событие: да (фиксированное число потоков) разветвлено: да (переменное число процессов)
Даже после прочтения большого количества документации (например: https://modwsgi.readthedocs.io/en/develop/user-guides/processes-and-threading.html) Я пытаюсь понять, как работает многопроцессорность в WSGI. Если я правильно понимаю, это работает следующим образом:
- Apache создает несколько процессов для обработки различных запросов
- Каждый процесс Apache имеет свой собственный интерпретатор modwsgi python для обработки Flask запросы
Моя apache конфигурация wsgi выглядит следующим образом:
WSGIScriptAlias / /home/app/flaskapp.wsgi
WSGIDaemonProcess app python-path=/home/app/Test:/home/app/venv/lib/python3.6/site-packages user=www-data group=www-data
WSGIProcessGroup app
WSGIPassAuthorization On
В настоящее время я не использую wsgi.multiprocess , потому что когда я использовал процессов = 1 в прошлом, иногда я мог видеть дубликаты данных в БД. Это была базовая c вставка, например: пользователь нажимал кнопку и отправлял быструю форму, содержащую некоторые данные. Эти данные обрабатывались несколько раз и попадали в БД несколько раз. Мне было интересно, почему .. Затем, удалив процессов = 1 , эта проблема прекратилась. Я думал, что это связано с тем ключом "процессов" в конфигурации.
Кто-нибудь знаком с этим? Зачем мне видеть несколько записей в БД? Более того, я пытался создать 2 копии приложения в 2 виртуальных хостах, когда я сильно забиваю одно приложение, apache занимает больше времени, чтобы загрузить страницу, но когда я перехожу во второе приложение (так как у меня новый WSGIDeamon, et c) ответ быстрее для второго приложения. Интересно, почему ... Для каждого Apache ребенка должен быть 1 интерпретатор WSGI python, почему это так медленно для одного приложения, а не для второго приложения в другом Vhost?
Короче говоря Любая идея, почему:
- Если у меня есть 2 копии одного и того же приложения под 2 различными vhosts с 2 различными WSGIDaemonProcess, если один сильно забит, первый медленно отвечает, но другой кажется работающим ок?
- Почему при "процессов = 1" я мог видеть несколько повторяющихся записей в БД? Когда я удалил его, вместо этого все выглядит нормально?
- Может кто-нибудь сказать мне, как тогда работают процессы = 5? Я не уверен, что полностью понимаю
Любые комментарии и технические примеры будут высоко оценены.
Спасибо