В чем разница между gunicorn и программным запуском сервера wsgi?
Я хотел бы знать, в чем разница между запуском сервера WSGI gunicorn с работниками eventlet
gunicorn --workers=2 -k eventlet test:app
и запуск сервера wsgi программно, как
from eventlet import wsgi
import eventlet
def hello_world(env, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return ['Hello, World!\r\n']
wsgi.server(eventlet.listen(('', 8090)), hello_world)
Я думаю, что Gunicorn более производительный, но почему? Какие есть отличия? Если мне придется делать это программно, будут ли у меня проблемы с производительностью?
3 ответа
Одно из больших отличий состоит в том, что оружейный завод разветвляет рабочие процессы. В вашем примере вы передаете аргумент --workers=2
который породит 2 рабочих процесса. Поскольку в Python есть глобальная блокировка интерпретатора (GIL), один процесс, выполняющий Eventlet, не может воспользоваться производительностью нескольких процессорных ядер, в то время как множественные рабочие процессы, порожденные оружием, могут. Если ваше приложение интенсивно использует процессор, это может значительно повысить производительность. Конечно, вы могли бы просто запустить несколько процессов, как, например, ваш пример eventlet.wsgi.
Другие ответы здесь связаны с некоторыми хорошими ресурсами для изучения вариантов.
И то и другое gunicorn
и wsgi
Модуль представляет собой реализацию стандарта для размещения приложений Python. Этот стандарт называется интерфейсом шлюза веб-сервера или WSGI. Есть еще много таких реализаций.
Какой из них вы выберете, зависит от ваших конкретных потребностей, в зависимости от цели развертывания (что там может быть установлено), ограничений памяти и ЦП, показателей производительности конкретной реализации, конкретных функций, предлагаемых реализациями, записи безопасности проекта (поддерживает ли проект) развертывание в производственной среде, количество поднятых проблем безопасности, время отклика на проблемы безопасности) и т. д. Мы не можем сделать этот выбор за вас.
Также см:
- этот обзор серверов WSGI, который рекомендует Gunicorn в качестве хорошей отправной точки, но содержит краткий список дополнительных опций, из которых вы можете выбрать.
- Этот двухчастный обзор серверов WSGI (обязательно прочитайте часть 2 для анализа производительности), который охватывает другое подмножество серверов. Я должен отметить, однако, что
bjoern
давно не обновлялся, и, как проект, потребуются дополнительные знания Python для правильной настройки.
Действительно, его производительность и то, как система управляет процессом, ключевые метрики, которые вы должны учитывать при оценке eventlet.wsgi и gunicorn:
- запросы обслуживаются
- задержка
- использование оперативной памяти
- использование процессора
- частота ошибок
Вы можете прочитать больше о тесте Python wsgi-серверов здесь и найти того, кому удалось сравнить те, которые вы хотите, определить, что вам нужно.
также, в связи с этим, вы должны учитывать управление процессом при развертывании на производстве.