fix(plugin): 为事件处理器添加异步锁和并行执行支持

在BaseEvent类中引入asyncio.Lock确保同一个事件不能同时激活多次
重构事件触发逻辑,使用asyncio.gather并行执行所有订阅者处理器
提高事件处理效率的同时保证线程安全
This commit is contained in:
Windpicker-owo
2025-08-28 17:18:01 +08:00
parent 935a82fa58
commit 786a830da5
2 changed files with 47 additions and 24 deletions

View File

@@ -2,7 +2,6 @@
事件管理器 - 实现Event和EventHandler的单例管理
提供统一的事件注册、管理和触发接口
"""
import asyncio
from typing import Dict, Type, List, Optional, Any, Union
from threading import Lock
@@ -39,7 +38,6 @@ class EventManager:
self._event_handlers: Dict[str, Type[BaseEventHandler]] = {}
self._pending_subscriptions: Dict[str, List[str]] = {} # 缓存失败的订阅
self._initialized = True
self.event_handle_lock = asyncio.Lock()
logger.info("EventManager 单例初始化完成")
def register_event(self, event_name: Union[EventType, str]) -> bool:
@@ -282,8 +280,8 @@ class EventManager:
if event is None:
logger.error(f"事件 {event_name} 不存在,无法触发")
return None
async with self.event_handle_lock:
return await event.activate(params)
return await event.activate(params)
def init_default_events(self) -> None:
"""初始化默认事件"""
@@ -295,8 +293,7 @@ class EventManager:
EventType.POST_LLM,
EventType.AFTER_LLM,
EventType.POST_SEND,
EventType.AFTER_SEND,
EventType.UNKNOWN
EventType.AFTER_SEND
]
for event_name in default_events: