import asyncio import logging from typing import Callable, Dict, List, Any, Awaitable logger = logging.getLogger("cs_agent") class AsyncEventBus: """ 异步事件总线:解耦业务触发与平台发送。 支持一个事件被多个订阅者监听。 """ def __init__(self): self._listeners: Dict[str, List[Callable[..., Awaitable[None]]]] = {} def subscribe(self, event_type: str, callback: Callable[..., Awaitable[None]]): """订阅事件""" if event_type not in self._listeners: self._listeners[event_type] = [] self._listeners[event_type].append(callback) logger.info(f"[EventBus] 新订阅者已注册到事件: {event_type}") async def emit(self, event_type: str, **kwargs): """发布事件:异步广播给所有订阅者""" if event_type not in self._listeners: return tasks = [] for callback in self._listeners[event_type]: tasks.append(asyncio.create_task(callback(**kwargs))) if tasks: results = await asyncio.gather(*tasks, return_exceptions=True) for i, r in enumerate(results): if isinstance(r, Exception): logger.error(f"[EventBus] 事件 {event_type} 订阅者 {i} 异常: {r}") logger.info(f"[EventBus] 事件 {event_type} 已广播给 {len(tasks)} 个订阅者") # 全局单例,所有模块共用这一个广播台 bus = AsyncEventBus()