Перейти к содержанию

Практикум: завершение HTTP-запросов перед закрытием ресурсов

driver.py запускает общий сервис отчётов и отправляет настоящие HTTP-запросы на localhost. Проверяются два исхода:

  • Принятый отчёт длительностью 0,8 секунды возвращает 200 после смены readiness на 503; хранилище закрывается позже.
  • Отчёт длительностью 30 секунд не укладывается в секундный лимит Uvicorn, отменяется и возвращает 500, поскольку отправка ответа ещё не началась. Затем закрывается ресурс. Такой ответ получен для этого обработчика и зафиксированных версий; это не общее правило для любой отмены.

AppSpec.drain_grace_seconds=3 оставляет HTTP-адаптеру время на завершение после лимита запроса в Uvicorn. Это разные ограничения. cleanup_timeout_seconds действует на отдельные шаги остановки; закрытие ресурсов в области приложения тоже должно иметь собственные ограничения.

server_servicewright.py и server_plain.py можно запускать вручную. Второй использует FastAPI lifespan и завершение запросов средствами Uvicorn: для многих приложений только с HTTP этого достаточно. Автоматический драйвер проверяет вариант с servicewright через Service.run(..., stop=event); он не посылает SIGTERM и не имитирует выкладку в Kubernetes. Доставку сигнала и задержку маршрутизации нужно проверить при развёртывании.

Сохраните соседний практикум с общим жизненным циклом: здесь используются его хранилище и обработчик. Docker не нужен.

Запустите из каталога docs/blog/lab/2026-09-07-graceful-shutdown в копии репозитория:

uv run --no-project --python 3.13 --with-requirements requirements.txt python driver.py

Исходный код практикума на GitHub.