lenec ru

← все посты

uvicorn vs gunicorn vs hypercorn vs granian: что выбрать в 2026

11K

На каждый питон-сервис рано или поздно встаёт вопрос: что запускать в проде. Был uvicorn в одиночку, стал uvicorn под gunicorn, кто-то ушёл в hypercorn, кто-то на granian. Картина запутанная, особенно для тех, кто впервые поднимает FastAPI или Starlette.

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

Сначала про разницу WSGI и ASGI

Если коротко: WSGI — синхронный протокол (Flask, Django до 3.1, gunicorn по умолчанию). ASGI — асинхронный, поверх него работают Starlette, FastAPI, async-режим Django.

FastAPI — это ASGI-приложение. Значит, тебе нужен ASGI-сервер. Все три кандидата — uvicorn, hypercorn, granian — это ASGI-серверы. Gunicorn же по природе WSGI, но умеет запускать ASGI-приложения через специальные воркер-классы (например, uvicorn.workers.UvicornWorker).

uvicorn

De-facto стандарт для FastAPI. Реализация на uvloop и httptools, написана плотно, отлично оптимизирована. По бенчмаркам стабильно в верхней группе.

Плюсы:

  • Производительность — одна из лучших в Python-экосистеме.
  • Отлично документирован, поддерживается командой Encode (FastAPI/Starlette).
  • Нативно умеет lifespan-эвенты ASGI, поддерживает HTTP/1.1 и WebSocket.
  • В 2024 году добавился полноценный multi-worker режим без gunicorn (--workers).

Минусы (точнее, ограничения):

  • Нет HTTP/2 и HTTP/3 из коробки. Если нужно — ставь reverse proxy (nginx, envoy, caddy) перед uvicorn.
  • Multi-worker режим до 0.30 не умел нормально перезапускать упавшие воркеры. Сейчас умеет, но стабильнее всё ещё gunicorn в этом плане.

Запуск:

uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 4

gunicorn (с uvicorn-воркерами)

Gunicorn сам по себе ASGI не понимает, но в связке с UvicornWorker запускает FastAPI без проблем. Долгие годы это была стандартная схема для прода.

Плюсы:

  • Зрелое управление воркерами: graceful restart, preload, max_requests, perfect signal handling.
  • Умеет worker-class из коробки, можно смешивать.
  • Хорошая телеметрия процессов.

Минусы:

  • Дополнительный слой между tcp-сокетом и приложением. Микро-оверхед, но в большинстве случаев заметить нельзя.
  • Конфигурация чуть сложнее — нужно держать два конфига, gunicorn и uvicorn worker.

Запуск:

gunicorn app.main:app \
  -k uvicorn.workers.UvicornWorker \
  -w 4 \
  -b 0.0.0.0:8000 \
  --max-requests 1000 \
  --max-requests-jitter 50

Параметр --max-requests с jitter полезен против медленных утечек памяти: воркер сам перезапускается через N запросов и освобождает RAM. На длинноживущих процессах это иногда спасает.

hypercorn

Самый зрелый ASGI-сервер с поддержкой HTTP/2 и HTTP/3 (через QUIC). Написан на чистом Python с помощью anyio, что даёт ему хорошую совместимость с trio (если ты используешь trio).

Плюсы:

  • Поддержка HTTP/2 и HTTP/3 без reverse proxy.
  • WebSocket, server-sent events работают штатно.
  • Конфигурация через файл, что удобно для сложных деплоев.

Минусы:

  • На бенчмарках обычно медленнее uvicorn в HTTP/1.1 сценариях.
  • Меньше комьюнити и меньше готовых рецептов.

Запуск:

hypercorn app.main:app --bind 0.0.0.0:8000 --workers 4 --bind-h2 :8443

Реальный плюс hypercorn проявляется, когда тебе нужен HTTP/2 без nginx. Например, в окружении, где трафик идёт сразу через Envoy с gRPC. Если у тебя обычный REST поверх HTTP/1.1 — uvicorn будет быстрее и проще.

granian

Сравнительно новый игрок. Сервер на Rust, поддерживает ASGI, RSGI и WSGI. По бенчмаркам быстрее uvicorn, особенно на маленьких ответах. В 2025 году подрос до уровня production-ready.

Плюсы:

  • Производительность — лидер по бенчмаркам.
  • Один бинарь без Python-зависимостей в рантайме воркера (Rust-процесс с GIL только в воркере).
  • Поддержка HTTP/2, плюс WebSocket.

Минусы:

  • Молодой, документация местами скуднее.
  • В 2026 пока нет такого количества рецептов и интеграций.
  • Рутина типа graceful reload, preload — есть, но менее обкатана.

Если ты строишь новый сервис и готов к чуть большему риску — granian уже стоит попробовать. Особенно если упираешься в throughput на FastAPI.

Что выбрать

Скучный, но честный ответ: для большинства команд в 2026 году рабочий выбор — uvicorn в multi-worker режиме. Это сочетание простоты, производительности и стабильности.

Когда стоит подумать про gunicorn-обёртку:

  • У вас уже есть привычная конфигурация gunicorn в инфраструктуре.
  • Нужно plug-in мониторинга на уровне процессов.
  • Памятные утечки приходится глушить через max-requests.

Когда брать hypercorn:

  • Нужен HTTP/2 или HTTP/3 без proxy перед сервером.
  • Часть кода уже на trio или anyio.

Когда смотреть granian:

  • Высокий RPS, упираемся в скорость.
  • Хочется единый бинарь без Python-сервера в стеке.
  • Команда готова немного потерпеть в плане документации.

Несколько практических советов

Независимо от выбора, есть вещи, которые мы делаем во всех сервисах.

Worker count. Стандартная формула 2 * cpu + 1 подходит для синхронного кода. Для async-эндпоинтов часто хватает cpu + 1 или просто cpu. Лишние воркеры жрут память и не дают прироста, потому что async и так держит много соединений на воркер.

Графы рестарта. Используй --graceful-timeout и --timeout. На k8s pod terminationGracePeriod должен быть больше graceful timeout сервера, иначе SIGTERM прервёт активные запросы.

Preload. В gunicorn (--preload) и granian преlode app в parent-процессе. Память шарится через copy-on-write, на больших приложениях экономия может быть в гигабайтах.

Логи. Все три сервера логируют по-своему, и форматы немного отличаются. Если у тебя структурированное логирование — настрой кастомный logger, не полагайся на встроенный access log в проде.

Reverse proxy. Перед любым из этих серверов в проде стоит nginx, envoy или caddy. Не выставляй python-сервер напрямую в интернет: ему нужен буфер для медленных клиентов, обработки TLS, статики, защиты от slowloris.

Что в сухом остатке

В 2026 году дефолт для FastAPI-приложения — uvicorn с multi-worker. Если есть привычка к gunicorn — оставь, ничего страшного. Hypercorn — нишевый выбор для HTTP/2/3 без прокси. Granian — кандидат для следующего сервиса, если ты упёрся в производительность.

Не гонись за самым свежим, если текущая связка работает. Серверный слой — место, где стабильность важнее, чем 5% прироста на синтетике.

Комментарии 0

  • Будьте первым, кто оставит комментарий.

Войдите, чтобы оставить комментарий.