from loguru import logger from typing import Dict, List, Type, Callable, Any from threading import Lock class Event: """事件基类""" def __init__(self, **kwargs): for key, value in kwargs.items(): setattr(self, key, value) class EventManager: """事件管理器,单例模式""" _instance = None _lock = Lock() @classmethod def get_instance(cls): """获取事件管理器实例""" if cls._instance is None: with cls._lock: if cls._instance is None: cls._instance = cls() return cls._instance def __init__(self): if EventManager._instance is not None: raise RuntimeError("EventManager 是单例类,请使用 get_instance() 方法获取实例") self.handlers: Dict[Type[Event], List[Callable]] = {} self.LOG = logger def register(self, event_type: Type[Event], handler: Callable) -> None: """注册事件处理器""" if event_type not in self.handlers: self.handlers[event_type] = [] if handler not in self.handlers[event_type]: self.handlers[event_type].append(handler) self.LOG.debug(f"注册事件处理器: {event_type.__name__} -> {handler.__name__}") def unregister(self, event_type: Type[Event], handler: Callable) -> None: """取消注册事件处理器""" if event_type in self.handlers and handler in self.handlers[event_type]: self.handlers[event_type].remove(handler) self.LOG.debug(f"取消注册事件处理器: {event_type.__name__} -> {handler.__name__}") def publish(self, event_type: Type[Event], event_data: Dict[str, Any] = None) -> None: """发布事件""" if event_data is None: event_data = {} event = event_type(**event_data) if event_type in self.handlers: for handler in self.handlers[event_type]: try: handler(event) except Exception as e: self.LOG.error(f"事件处理器 {handler.__name__} 处理 {event_type.__name__} 事件出错: {e}")