Какие существуют ASGI-серверы для Python?

Ответ

В экосистеме Python для запуска ASGI-приложений (таких как FastAPI, Starlette, Django 3+) используются несколько популярных серверов:

  1. Uvicorn Высокопроизводительный сервер, основанный на uvloop и httptools. Считается стандартом для разработки с фреймворками FastAPI и Starlette благодаря своей скорости и простоте.

    # Запуск для разработки с автоперезагрузкой
    uvicorn main:app --reload
  2. Hypercorn Гибкий сервер с поддержкой HTTP/2, HTTP/3 и альтернативных event loop, таких как Trio. Подходит для более сложных сценариев, требующих современных протоколов.

    hypercorn main:app
  3. Daphne Официальный сервер для Django Channels, изначально созданный для надежной поддержки WebSocket и других долгоживущих соединений.

    daphne myproject.asgi:application
  4. Связка Gunicorn + Uvicorn Это не отдельный сервер, а популярная production-конфигурация. Gunicorn выступает в роли менеджера процессов (worker manager), запуская и контролируя несколько Uvicorn процессов для обеспечения масштабируемости и отказоустойчивости.

    # Gunicorn управляет воркерами класса UvicornWorker
    gunicorn -k uvicorn.workers.UvicornWorker main:app

Ответ 18+ 🔞

А, слушай, смотри, вот эти твои ASGI-приложения, типа FastAPI там или Starlette, их же на чем-то запускать надо, да? Не на пальцах же их крутить. Так вот, есть у нас тут несколько таких рабочих лошадок, которые это всё дело поднимают.

Первое, что в зубы сразу попадает — это Uvicorn. Ну, это типа как наш местный чемпион по скорости, потому что он на uvloop и httptools заточен. Все его юзают для разработки, потому что он быстрый и простой, как три копейки. Хочешь, чтобы код сам перезагружался, когда ты его меняешь? Легко, блядь.

uvicorn main:app --reload

Вот и вся магия. Написал, сохранил — сервер уже с новым кодом работает. Удобно, ёпта.

Дальше у нас Hypercorn. Этот чувак похитрее будет. Он тебе и HTTP/2 потянет, и HTTP/3, если очень захотеть. И с разными event loop'ами умеет работать, не только с asyncio. Если тебе нужны современные протоколы или какая-то нестандартная хуйня — он твой выбор.

hypercorn main:app

Потом есть Daphne. Это, можно сказать, спецназ для WebSocket'ов. Его изначально для Django Channels пилили, чтобы долгоживущие соединения не отваливались нахуй. Так что если у тебя там чаты, онлайн-игры или еще какая дичь с постоянной связью — присмотрись к нему.

daphne myproject.asgi:application

И наконец, король продакшена — связка Gunicorn + Uvicorn. Это когда ты берешь Gunicorn, который умеет управлять кучей процессов, и заставляешь его запускать не своих стандартных воркеров, а этих самых Uvicorn'овских. Получается такая армада из быстрых серверов, которые друг друга подстраховывают. Один загнётся — остальные будут работать, и пользователь даже не заметит, что там у тебя внутри пиздец творится. Красота же!

gunicorn -k uvicorn.workers.UvicornWorker main:app

Вот так вот, коротко и без воды. Выбирай, что под задачу подходит, и не парься. Главное — не пытайся всё это в одном скрипте запустить, а то получишь ебаный винегрет.