#!/usr/bin/env python3 # -*- coding: utf-8 -*- import logging from typing import Dict, Any, List, Optional import asyncio logger = logging.getLogger(__name__) class ServiceManager: """服务管理器 - 管理所有框架服务的生命周期""" def __init__(self): self.services: Dict[str, Any] = {} self._startup_order: List[str] = [] self._health_checks: Dict[str, Any] = {} logger.debug("ServiceManager初始化完成") def register_service(self, name: str, service_instance, depends_on: Optional[List[str]] = None, health_check=None): """注册服务""" if name in self.services: logger.warning(f"服务 {name} 已存在,将被覆盖") self.services[name] = service_instance self._startup_order.append(name) if health_check: self._health_checks[name] = health_check logger.debug(f"服务 {name} 注册成功") def get_service(self, name: str): """获取服务""" service = self.services.get(name) if not service: raise ValueError(f"服务 {name} 未找到。可用: {list(self.services.keys())}") return service def has_service(self, name: str) -> bool: """检查服务是否已注册""" return name in self.services async def check_health(self, name: str = None) -> Dict[str, bool]: """健康检查""" results = {} names = [name] if name else list(self._health_checks.keys()) for n in names: if n in self._health_checks: try: r = self._health_checks[n]() if asyncio.iscoroutine(r): r = await r results[n] = bool(r) except Exception as e: logger.warning(f"服务 {n} 健康检查失败: {e}") results[n] = False return results @property def startup_order(self) -> List[str]: return list(self._startup_order) def shutdown_all(self): """关闭所有服务""" logger.info("开始关闭所有服务") for name in reversed(self._startup_order): service = self.services.get(name) if service and hasattr(service, 'shutdown'): try: if asyncio.iscoroutinefunction(service.shutdown): try: loop = asyncio.get_running_loop() loop.create_task(service.shutdown()) except RuntimeError: service.shutdown() else: service.shutdown() logger.debug(f"服务 {name} 关闭成功") except Exception as e: logger.error(f"关闭服务 {name} 时出错: {e}") logger.info("所有服务关闭完成")