Python3, modwsgi и Apache многопроцессорная и многопоточность - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть следующая реализация кода:

  • 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? Я не уверен, что полностью понимаю

Любые комментарии и технические примеры будут высоко оценены.

Спасибо

...