"""应用生命周期管理""" import asyncio from contextlib import asynccontextmanager from fastapi import FastAPI from app.core.db import init_db, get_db from app.core.config import settings as app_settings from app.core.log import logger from app.api.deps import create_scheduler_service from app.repositories.settings_repo import SettingsRepository settings_repo = SettingsRepository() @asynccontextmanager async def lifespan(app: FastAPI): """应用启动和关闭时的生命周期管理""" # 初始化数据库 await init_db() # 创建调度器并挂载到 app.state scheduler_service = create_scheduler_service() app.state.scheduler_service = scheduler_service app.state.validation_queue = scheduler_service.validation_queue # 加载设置并决定是否启动调度器 try: async with get_db() as db: settings = await settings_repo.get_all(db) scheduler_service.interval_minutes = settings.get( "validate_interval_minutes", app_settings.validator_timeout ) if settings.get("auto_validate", True): await scheduler_service.start() except Exception as e: logger.error(f"Failed to load settings on startup: {e}") logger.info("API server started") yield # 关闭调度器 if scheduler_service._validate_task and not scheduler_service._validate_task.done(): scheduler_service._validate_task.cancel() try: await scheduler_service._validate_task except asyncio.CancelledError: pass await scheduler_service.stop() await scheduler_service.validation_queue.validator.close() logger.info("API server shutdown")