Как корректно завершить FastAPI/asyncio-сервис без потерь данных: остановить фоновые задачи, закрыть соединения (DB/HTTP/Redis) и не зависнуть на выключении?
Обработать SIGTERM/SIGINT через lifespan (@asynccontextmanager или app.router.lifespan): пометить приложение как «not-ready», перестать принимать новые задания, отправить отмену всем фоновым задачам (хранить ссылки/TaskGroup), дождаться их с таймаутом (await asyncio.gather(..., return_exceptions=True)), корректно закрыть пулы (await pool.close()), опустошить/дренировать очереди. Критичные операции обернуть в asyncio.shield/идемпотентность, прокидывать CancellationToken/timeouts, логировать незавершённые таски.
Библиотека собеса по Python
Post #1058
1.01K
- 👍 3