Назад | Перейти на главную страницу

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

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

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

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

Спасибо

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

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

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

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

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

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

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

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

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

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

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

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

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

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