Многопоточность Django на apache/mod_wsgi/windows

Многопоточность Django на apache/mod_wsgi/windows

Я довольно новичок в сочетании apache и django и, честно говоря, довольно наивен в отношении того, как обрабатывается многопоточность. В частности, я работаю на сервере Windows, поэтому я знаю, что MPM основан только на потоках.

У меня есть приложение, которое обслуживает страницы веб-сайта, и другое приложение, которое выполняет ресурсоемкий фоновый процесс, который происходит время от времени и занимает около 30 секунд. Я беспокоюсь, что могу столкнуться с проблемами производительности, и у меня есть несколько вопросов, надеюсь, они помогут и другим...

  1. Как apache распределяет параллельные запросы между потоками? и между процессорами? Какая логика управляет этим? Каждый запрос порождает отдельный поток?
  2. Могу ли я вручную указать определенное приложение для запуска на отдельном ЦП? Например, если у меня есть машина с 4 ЦП, могу ли я установить 1 ЦП для запросов веб-сайта и 3 других для запуска фонового процесса по требованию?
  3. Как несколько потоков читают/пишут в одну и ту же базу данных? Я не ожидаю коллизий, поскольку запись будет выполняться для каждого пользователя, но я не знаю, как это на самом деле обрабатывается.
  4. Что произойдет, если у меня будет больше одной такой машины, например, работающей на EC2 и имеющей больше одного экземпляра? Как распределяются запросы?

Спасибо

решение1

Для общего чтения см.:

Как Apache распределяет одновременные запросы между потоками?

Для многопоточной конфигурации есть пул предварительно созданных потоков. Когда поступает новый запрос, он передается одному из доступных потоков в пуле для обработки. После завершения поток возвращается в пул.

Как Apache распределяет одновременные запросы между процессорами?

Это не так, где поток выполняется в любой конкретный момент времени, определяется операционной системой. Потоки не привязаны к определенному процессору Apache, поэтому выполнение может перемещаться.

Каждый запрос порождает отдельный поток?

Для веб-запросов, обрабатываемых Apache, ответ — нет.

Могу ли я вручную указать, что определенное приложение должно работать на отдельном процессоре?

Есть способы, которыми вы можете установить привязку процессора, чтобы привязать процессы к процессорам, но как вы это сделаете, зависит от системы. Насколько мне известно, сам Apache не предоставляет никакого механизма конфигурации, чтобы сделать это для себя.

Как несколько потоков читают/пишут в одну и ту же базу данных?

Осторожно. Обычно процесс сервера базы данных заботится обо всем этом, так что вам не о чем беспокоиться. В клиенте вам нужно убедиться, что каждый поток использует свое собственное подключение к базе данных, создавая одно для каждого запроса, или у вас есть пул подключений к базе данных, и потоки берут подключение из пула, когда требуется, и возвращают его, когда все сделано.

Обратите внимание, что это предполагает базу данных, доступ к которой осуществляется через серверный процесс. Если вы используете базу данных на основе файловой системы, то клиентская библиотека базы данных должна гарантировать безопасность многопоточного доступа.

Что произойдет, если у меня будет больше одной такой машины, например, работающей на EC2 и имеющей больше одного экземпляра? Как распределяются запросы?

Вам понадобится какой-то фронтенд-балансировщик нагрузки для распределения запросов. Это может быть правильный балансировщик нагрузки, или вы можете использовать фронтенд nginx в качестве прокси.

Связанный контент