Подтвердить что ты не робот

Торнадо против wsgi (с пушкой)

Я прочитал этот об Торнадо:

С другой стороны, если у вас уже есть приложение WSGI и вы хотите его запустить на пылающем быстром tornado.httpserver.HTTPServer, обертывает его tornado.wsgi.WSGIContainer. Но вам нужно быть осторожным. Поскольку ваши оригинальное приложение не подготовлено для асинхронного сервера и сделает много IO/вычислений, он будет блокировать другие запросы, пока генерирование ответа (дальнейшие запросы будут приниматься и буферизироваться но поставлены в очередь для последующей обработки).

И Guincorn говорит:

'HTTP-сервер Python WSGI для UNIX. Его модель предварительного предсказателя портирован из проекта Rubys Unicorn.

  • Итак, Gunicorn создаст рабочий процесс для обработки запроса?
  • Один собеседник на одного работника?
  • В то время как торнадо будет использовать epoll или kqueue для выполнения работы в одном процессе (без процесса мастера/работника)?
  • Итак, если я использую блокирующий вызов (например, requests.get в функции get/post обработчика), это блокирует всю обработку запроса или обрабатывает только текущий запрос?
4b9b3361

Ответ 1

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

В случае с Торнадо существует также скрытая опасность.

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

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

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

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

Таким образом, Tornado может быть очень хорош для очень небольшого пользовательского приложения WSGI, где они не делают многого, поэтому ответ очень быстрый, но он может пострадать, когда у вас давно запущены запросы, запущенные под блокирующим WSGI-приложением. Таким образом, Gunicorn будет лучше, поскольку у него есть надлежащая способность обрабатывать параллельные запросы. Тем не менее, если пулеметчик однопоточен и требует нескольких рабочих процессов, он будет использовать гораздо больше памяти.

Таким образом, у обоих есть компромиссы, и в некоторых случаях вам может быть лучше использовать сервер WSGI, который предлагает concurrency через многопоточность, а также несколько рабочих процессов. Это позволяет обрабатывать параллельные запросы, но не сбрасывать использование памяти, требуя много рабочих процессов. В то же время вам необходимо сбалансировать количество потоков в каждом процессе с использованием нескольких процессов, чтобы не страдать от влияния GIL в тяжелом приложении процессора.

Выбор серверов WSGI с возможностью многопоточности - mod_wsgi, uWSGI и официантка. Для официанток, хотя вы ограничены одним рабочим процессом.

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