Вопрос проверяет понимание жизненного цикла приложения FastAPI и умение использовать события startup и shutdown для инициализации и очистки ресурсов.
FastAPI предоставляет механизм для выполнения кода в моменты запуска и остановки приложения. Это реализовано через события startup и shutdown, которые являются частью жизненного цикла ASGI-приложения. Они позволяют разработчику безопасно управлять ресурсами, которые должны быть доступны на всём протяжении работы сервера.
При запуске веб-приложения часто требуется инициализировать внешние ресурсы: подключиться к базе данных, загрузить модель машинного обучения, установить соединение с Redis или инициализировать пул потоков. Без события startup это пришлось бы делать в глобальной области видимости, что может привести к проблемам с тестированием и повторным использованием кода. Событие shutdown, в свою очередь, гарантирует корректное освобождение ресурсов при остановке сервера, предотвращая утечки соединений и потерю данных.
from fastapi import FastAPI
import asyncpg
app = FastAPI()
db_pool = None
@app.on_event("startup")
async def startup():
global db_pool
db_pool = await asyncpg.create_pool(
user="user", password="pass",
database="db", host="localhost"
)
print("Database pool created")
@app.on_event("shutdown")
async def shutdown():
global db_pool
if db_pool:
await db_pool.close()
print("Database pool closed")
@app.get("/")
async def root():
async with db_pool.acquire() as conn:
result = await conn.fetchval("SELECT 1")
return {"result": result}В этом примере при старте создаётся пул соединений к PostgreSQL, который используется во всех эндпоинтах. При остановке приложения пул корректно закрывается. Без shutdown соединения могли бы остаться открытыми, что привело бы к исчерпанию лимитов базы данных.
Начиная с FastAPI 0.93, рекомендуется использовать контекстный менеджер lifespan вместо отдельных декораторов. Это более гибкий и чистый способ управления жизненным циклом:
from contextlib import asynccontextmanager
from fastapi import FastAPI
@asynccontextmanager
async def lifespan(app: FastAPI):
# startup
print("Starting up...")
yield
# shutdown
print("Shutting down...")
app = FastAPI(lifespan=lifespan)Такой подход позволяет легко добавлять логику инициализации и очистки, а также лучше интегрируется с тестовыми фреймворками.
События startup и shutdown (или lifespan) необходимы для управления ресурсами в FastAPI-приложениях. Их следует использовать всегда, когда требуется инициализация или очистка глобальных объектов — подключений к БД, кэшей, внешних API-клиентов. Это делает приложение надёжным, тестируемым и устойчивым к утечкам памяти.
Уровень
Рейтинг:
4
Сложность:
4
Навыки
Node.js
FastAPI
Ключевые слова
Подпишись на Python Developer в телеграм