EG/plugins/user/network_sync/events/event_handler.py
2025-12-12 16:16:15 +08:00

1158 lines
42 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
事件处理器模块
负责处理网络同步相关的事件
"""
import time
from typing import Dict, Any, List, Optional, Callable
import threading
import queue
class NetworkEvent:
"""网络事件类"""
def __init__(self, event_type: str, data: Dict[str, Any], timestamp: float = None):
self.event_type = event_type
self.data = data
self.timestamp = timestamp or time.time()
self.handled = False
self.processed = False
class EventHandler:
"""
事件处理器
负责处理网络同步相关的事件
"""
def __init__(self, plugin):
"""
初始化事件处理器
Args:
plugin: 网络同步插件实例
"""
self.plugin = plugin
self.enabled = False
self.initialized = False
# 事件配置
self.event_config = {
"enable_event_queue": True,
"max_queue_size": 1000,
"enable_async_processing": True,
"max_processing_threads": 4,
"event_timeout": 30.0,
"enable_event_filtering": True,
"enable_event_prioritization": True,
"enable_event_coalescing": True,
"coalesce_time_window": 0.1, # 100ms
"enable_event_logging": True,
"log_level": "INFO"
}
# 事件队列
self.event_queue = queue.Queue(maxsize=self.event_config["max_queue_size"])
self.priority_queue = queue.PriorityQueue()
# 事件处理器映射
self.event_handlers = {}
# 事件监听器
self.event_listeners = {}
# 事件统计
self.event_stats = {
"events_received": 0,
"events_processed": 0,
"events_dropped": 0,
"events_timed_out": 0,
"handler_errors": 0,
"async_tasks": 0,
"coalesced_events": 0
}
# 事件合并缓存
self.coalesce_cache = {}
# 异步处理线程
self.processing_threads = []
self.running = False
# 回调函数
self.event_callbacks = {
"event_received": [],
"event_processed": [],
"event_dropped": [],
"event_error": []
}
# 时间戳记录
self.last_event_time = 0.0
self.last_processing_time = 0.0
print("✓ 事件处理器已创建")
def initialize(self) -> bool:
"""
初始化事件处理器
Returns:
是否初始化成功
"""
try:
# 注册默认事件处理器
self._register_default_handlers()
self.initialized = True
print("✓ 事件处理器初始化完成")
return True
except Exception as e:
print(f"✗ 事件处理器初始化失败: {e}")
import traceback
traceback.print_exc()
return False
def enable(self) -> bool:
"""
启用事件处理器
Returns:
是否启用成功
"""
try:
if not self.initialized:
print("✗ 事件处理器未初始化")
return False
self.enabled = True
self.running = True
# 启动事件处理线程
if self.event_config["enable_async_processing"]:
thread_count = self.event_config["max_processing_threads"]
for i in range(thread_count):
thread = threading.Thread(target=self._event_processing_loop, daemon=True,
name=f"EventProcessor-{i}")
self.processing_threads.append(thread)
thread.start()
print("✓ 事件处理器已启用")
return True
except Exception as e:
print(f"✗ 事件处理器启用失败: {e}")
import traceback
traceback.print_exc()
return False
def disable(self):
"""禁用事件处理器"""
try:
self.enabled = False
self.running = False
# 等待处理线程结束
for thread in self.processing_threads:
if thread.is_alive():
thread.join(timeout=2.0)
self.processing_threads.clear()
print("✓ 事件处理器已禁用")
except Exception as e:
print(f"✗ 事件处理器禁用失败: {e}")
import traceback
traceback.print_exc()
def finalize(self):
"""清理事件处理器资源"""
try:
self.disable()
self.event_handlers.clear()
self.event_listeners.clear()
self.event_callbacks.clear()
self.coalesce_cache.clear()
# 清空队列
while not self.event_queue.empty():
try:
self.event_queue.get_nowait()
except queue.Empty:
break
while not self.priority_queue.empty():
try:
self.priority_queue.get_nowait()
except queue.Empty:
break
self.initialized = False
print("✓ 事件处理器资源已清理")
except Exception as e:
print(f"✗ 事件处理器资源清理失败: {e}")
import traceback
traceback.print_exc()
def update(self, dt: float):
"""
更新事件处理器状态
Args:
dt: 时间增量
"""
try:
if not self.enabled:
return
current_time = time.time()
self.last_processing_time = current_time
# 清理过期的合并缓存
self._cleanup_coalesce_cache(current_time)
except Exception as e:
print(f"✗ 事件处理器更新失败: {e}")
import traceback
traceback.print_exc()
def _register_default_handlers(self):
"""注册默认事件处理器"""
try:
# 网络相关事件
self.register_event_handler("network_connected", self._handle_network_connected)
self.register_event_handler("network_disconnected", self._handle_network_disconnected)
self.register_event_handler("network_error", self._handle_network_error)
self.register_event_handler("network_data_received", self._handle_network_data_received)
self.register_event_handler("network_data_sent", self._handle_network_data_sent)
# 同步相关事件
self.register_event_handler("object_synced", self._handle_object_synced)
self.register_event_handler("sync_error", self._handle_sync_error)
self.register_event_handler("interpolation_updated", self._handle_interpolation_updated)
self.register_event_handler("extrapolation_updated", self._handle_extrapolation_updated)
# 连接相关事件
self.register_event_handler("client_connected", self._handle_client_connected)
self.register_event_handler("client_disconnected", self._handle_client_disconnected)
self.register_event_handler("connection_timeout", self._handle_connection_timeout)
# 协议相关事件
self.register_event_handler("message_received", self._handle_message_received)
self.register_event_handler("message_sent", self._handle_message_sent)
self.register_event_handler("protocol_error", self._handle_protocol_error)
# 时钟相关事件
self.register_event_handler("sync_started", self._handle_sync_started)
self.register_event_handler("sync_completed", self._handle_sync_completed)
self.register_event_handler("sync_failed", self._handle_sync_failed)
self.register_event_handler("time_updated", self._handle_time_updated)
self.register_event_handler("sync_quality_changed", self._handle_sync_quality_changed)
# 配置相关事件
self.register_event_handler("config_loaded", self._handle_config_loaded)
self.register_event_handler("config_saved", self._handle_config_saved)
self.register_event_handler("config_changed", self._handle_config_changed)
self.register_event_handler("config_error", self._handle_config_error)
# 序列化相关事件
self.register_event_handler("data_serialized", self._handle_data_serialized)
self.register_event_handler("data_deserialized", self._handle_data_deserialized)
self.register_event_handler("serialization_error", self._handle_serialization_error)
self.register_event_handler("deserialization_error", self._handle_deserialization_error)
# 预测相关事件
self.register_event_handler("prediction_updated", self._handle_prediction_updated)
self.register_event_handler("correction_applied", self._handle_correction_applied)
self.register_event_handler("snap_correction", self._handle_snap_correction)
self.register_event_handler("prediction_error", self._handle_prediction_error)
print("✓ 默认事件处理器已注册")
except Exception as e:
print(f"✗ 默认事件处理器注册失败: {e}")
def _event_processing_loop(self):
"""事件处理循环"""
try:
while self.running:
try:
# 优先处理优先级队列中的事件
try:
priority, event = self.priority_queue.get(timeout=0.01)
self._process_event(event)
self.priority_queue.task_done()
except queue.Empty:
# 处理普通队列中的事件
try:
event = self.event_queue.get(timeout=0.01)
self._process_event(event)
self.event_queue.task_done()
except queue.Empty:
# 没有事件,短暂休眠
time.sleep(0.001)
except Exception as e:
print(f"✗ 事件处理循环错误: {e}")
time.sleep(0.1)
except Exception as e:
print(f"✗ 事件处理循环失败: {e}")
def _process_event(self, event: NetworkEvent):
"""
处理事件
Args:
event: 网络事件
"""
try:
current_time = time.time()
# 检查事件是否超时
if current_time - event.timestamp > self.event_config["event_timeout"]:
self.event_stats["events_timed_out"] += 1
self._trigger_event_callback("event_dropped", {
"event": event,
"reason": "timeout"
})
return
# 查找事件处理器
handler = self.event_handlers.get(event.event_type)
if handler:
try:
# 调用事件处理器
result = handler(event.data)
event.processed = True
# 更新统计信息
self.event_stats["events_processed"] += 1
# 触发事件处理完成回调
self._trigger_event_callback("event_processed", {
"event": event,
"result": result,
"processing_time": time.time() - event.timestamp
})
except Exception as e:
print(f"✗ 事件处理器执行失败: {event.event_type} - {e}")
self.event_stats["handler_errors"] += 1
# 触发事件错误回调
self._trigger_event_callback("event_error", {
"event": event,
"error": str(e)
})
else:
# 没有找到处理器,但仍标记为已处理
event.processed = True
self.event_stats["events_processed"] += 1
# 触发事件处理完成回调
self._trigger_event_callback("event_processed", {
"event": event,
"result": None,
"processing_time": time.time() - event.timestamp
})
except Exception as e:
print(f"✗ 事件处理失败: {e}")
def post_event(self, event_type: str, data: Dict[str, Any] = None,
priority: int = 0, timestamp: float = None) -> bool:
"""
发布事件
Args:
event_type: 事件类型
data: 事件数据
priority: 事件优先级(数字越小优先级越高)
timestamp: 事件时间戳
Returns:
是否发布成功
"""
try:
if not self.enabled:
print("✗ 事件处理器未启用")
return False
# 创建事件对象
event = NetworkEvent(event_type, data or {}, timestamp)
# 触发事件接收回调
self._trigger_event_callback("event_received", {
"event": event
})
# 检查事件合并
if self.event_config["enable_event_coalescing"]:
if self._coalesce_event(event):
# 事件已合并,不需要添加到队列
return True
# 添加到相应队列
if priority > 0 and self.event_config["enable_event_prioritization"]:
# 添加到优先级队列
try:
self.priority_queue.put((priority, event), timeout=0.1)
except queue.Full:
self.event_stats["events_dropped"] += 1
self._trigger_event_callback("event_dropped", {
"event": event,
"reason": "priority_queue_full"
})
return False
else:
# 添加到普通队列
try:
self.event_queue.put(event, timeout=0.1)
except queue.Full:
self.event_stats["events_dropped"] += 1
self._trigger_event_callback("event_dropped", {
"event": event,
"reason": "queue_full"
})
return False
self.event_stats["events_received"] += 1
self.last_event_time = event.timestamp
return True
except Exception as e:
print(f"✗ 事件发布失败: {e}")
return False
def _coalesce_event(self, event: NetworkEvent) -> bool:
"""
合并事件
Args:
event: 网络事件
Returns:
是否合并成功
"""
try:
if not self.event_config["enable_event_coalescing"]:
return False
current_time = time.time()
coalesce_key = f"{event.event_type}_{hash(str(event.data))}"
# 检查是否在合并时间窗口内
if coalesce_key in self.coalesce_cache:
cached_event, cache_time = self.coalesce_cache[coalesce_key]
if current_time - cache_time < self.event_config["coalesce_time_window"]:
# 合并事件
self.event_stats["coalesced_events"] += 1
return True
# 缓存事件
self.coalesce_cache[coalesce_key] = (event, current_time)
return False
except Exception as e:
print(f"✗ 事件合并失败: {e}")
return False
def _cleanup_coalesce_cache(self, current_time: float):
"""
清理合并缓存
Args:
current_time: 当前时间
"""
try:
expired_keys = [
key for key, (_, cache_time) in self.coalesce_cache.items()
if current_time - cache_time > self.event_config["coalesce_time_window"] * 2
]
for key in expired_keys:
del self.coalesce_cache[key]
except Exception as e:
print(f"✗ 合并缓存清理失败: {e}")
def register_event_handler(self, event_type: str, handler: Callable) -> bool:
"""
注册事件处理器
Args:
event_type: 事件类型
handler: 处理器函数
Returns:
是否注册成功
"""
try:
self.event_handlers[event_type] = handler
print(f"✓ 事件处理器已注册: {event_type}")
return True
except Exception as e:
print(f"✗ 事件处理器注册失败: {e}")
return False
def unregister_event_handler(self, event_type: str) -> bool:
"""
注销事件处理器
Args:
event_type: 事件类型
Returns:
是否注销成功
"""
try:
if event_type in self.event_handlers:
del self.event_handlers[event_type]
print(f"✓ 事件处理器已注销: {event_type}")
return True
else:
print(f"✗ 事件处理器不存在: {event_type}")
return False
except Exception as e:
print(f"✗ 事件处理器注销失败: {e}")
return False
def register_event_listener(self, event_type: str, listener: Callable) -> bool:
"""
注册事件监听器
Args:
event_type: 事件类型
listener: 监听器函数
Returns:
是否注册成功
"""
try:
if event_type not in self.event_listeners:
self.event_listeners[event_type] = []
self.event_listeners[event_type].append(listener)
print(f"✓ 事件监听器已注册: {event_type}")
return True
except Exception as e:
print(f"✗ 事件监听器注册失败: {e}")
return False
def unregister_event_listener(self, event_type: str, listener: Callable) -> bool:
"""
注销事件监听器
Args:
event_type: 事件类型
listener: 监听器函数
Returns:
是否注销成功
"""
try:
if event_type in self.event_listeners:
if listener in self.event_listeners[event_type]:
self.event_listeners[event_type].remove(listener)
print(f"✓ 事件监听器已注销: {event_type}")
return True
print(f"✗ 事件监听器不存在: {event_type}")
return False
except Exception as e:
print(f"✗ 事件监听器注销失败: {e}")
return False
# 默认事件处理器
def _handle_network_connected(self, data: Dict[str, Any]) -> bool:
"""处理网络连接事件"""
try:
print(f"✓ 网络已连接: {data}")
# 更新连接状态
if self.plugin.connection_manager:
self.plugin.connection_manager.client_state["is_connected"] = True
self.plugin.connection_manager.client_state["connection_time"] = time.time()
return True
except Exception as e:
print(f"✗ 网络连接事件处理失败: {e}")
return False
def _handle_network_disconnected(self, data: Dict[str, Any]) -> bool:
"""处理网络断开事件"""
try:
print(f"✓ 网络已断开: {data}")
# 更新连接状态
if self.plugin.connection_manager:
self.plugin.connection_manager.client_state["is_connected"] = False
self.plugin.connection_manager.client_state["connection_time"] = 0.0
return True
except Exception as e:
print(f"✗ 网络断开事件处理失败: {e}")
return False
def _handle_network_error(self, data: Dict[str, Any]) -> bool:
"""处理网络错误事件"""
try:
print(f"✗ 网络错误: {data}")
# 记录错误统计
self.event_stats["handler_errors"] += 1
return True
except Exception as e:
print(f"✗ 网络错误事件处理失败: {e}")
return False
def _handle_network_data_received(self, data: Dict[str, Any]) -> bool:
"""处理网络数据接收事件"""
try:
# 将数据传递给协议处理器
if self.plugin.protocol_handler:
self.plugin.protocol_handler.receive_message(data.get("message_data", b""))
return True
except Exception as e:
print(f"✗ 网络数据接收事件处理失败: {e}")
return False
def _handle_network_data_sent(self, data: Dict[str, Any]) -> bool:
"""处理网络数据发送事件"""
try:
# 可以在这里添加发送确认逻辑
return True
except Exception as e:
print(f"✗ 网络数据发送事件处理失败: {e}")
return False
def _handle_object_synced(self, data: Dict[str, Any]) -> bool:
"""处理对象同步事件"""
try:
object_id = data.get("object_id")
object_data = data.get("object_data")
# 更新对象状态
if self.plugin.object_sync and object_id and object_data:
self.plugin.object_sync.update_object(object_id, object_data)
return True
except Exception as e:
print(f"✗ 对象同步事件处理失败: {e}")
return False
def _handle_sync_error(self, data: Dict[str, Any]) -> bool:
"""处理同步错误事件"""
try:
print(f"✗ 同步错误: {data}")
# 记录错误统计
self.event_stats["handler_errors"] += 1
return True
except Exception as e:
print(f"✗ 同步错误事件处理失败: {e}")
return False
def _handle_interpolation_updated(self, data: Dict[str, Any]) -> bool:
"""处理插值更新事件"""
try:
# 可以在这里添加插值更新后的处理逻辑
return True
except Exception as e:
print(f"✗ 插值更新事件处理失败: {e}")
return False
def _handle_extrapolation_updated(self, data: Dict[str, Any]) -> bool:
"""处理外推更新事件"""
try:
# 可以在这里添加外推更新后的处理逻辑
return True
except Exception as e:
print(f"✗ 外推更新事件处理失败: {e}")
return False
def _handle_client_connected(self, data: Dict[str, Any]) -> bool:
"""处理客户端连接事件"""
try:
client_id = data.get("client_id")
address = data.get("address")
print(f"✓ 客户端已连接: {client_id} ({address})")
# 添加到连接管理器
if self.plugin.connection_manager and client_id and address:
# 这里需要访问socket对象简化处理
pass
return True
except Exception as e:
print(f"✗ 客户端连接事件处理失败: {e}")
return False
def _handle_client_disconnected(self, data: Dict[str, Any]) -> bool:
"""处理客户端断开事件"""
try:
client_id = data.get("client_id")
reason = data.get("reason", "unknown")
print(f"✓ 客户端已断开: {client_id} (原因: {reason})")
# 从连接管理器移除
if self.plugin.connection_manager and client_id:
self.plugin.connection_manager.remove_client(client_id, reason)
return True
except Exception as e:
print(f"✗ 客户端断开事件处理失败: {e}")
return False
def _handle_connection_timeout(self, data: Dict[str, Any]) -> bool:
"""处理连接超时事件"""
try:
client_id = data.get("client_id")
print(f"✓ 连接超时: {client_id}")
# 断开超时连接
if self.plugin.connection_manager and client_id:
self.plugin.connection_manager.remove_client(client_id, "timeout")
return True
except Exception as e:
print(f"✗ 连接超时事件处理失败: {e}")
return False
def _handle_message_received(self, data: Dict[str, Any]) -> bool:
"""处理消息接收事件"""
try:
message_type = data.get("type")
message_data = data.get("data")
print(f"✓ 消息已接收: {message_type}")
# 根据消息类型处理
if message_type == "sync_data":
# 处理同步数据
if self.plugin.object_sync and message_data:
for obj_id, obj_data in message_data.items():
self.plugin.object_sync.receive_sync_data(obj_id, obj_data)
elif message_type == "heartbeat":
# 处理心跳包
if self.plugin.connection_manager:
# 需要client_id来处理心跳
pass
return True
except Exception as e:
print(f"✗ 消息接收事件处理失败: {e}")
return False
def _handle_message_sent(self, data: Dict[str, Any]) -> bool:
"""处理消息发送事件"""
try:
message_type = data.get("type")
fragmented = data.get("fragmented", False)
print(f"✓ 消息已发送: {message_type} ({'分片' if fragmented else '完整'})")
return True
except Exception as e:
print(f"✗ 消息发送事件处理失败: {e}")
return False
def _handle_protocol_error(self, data: Dict[str, Any]) -> bool:
"""处理协议错误事件"""
try:
error = data.get("error", "Unknown protocol error")
print(f"✗ 协议错误: {error}")
# 记录错误统计
self.event_stats["handler_errors"] += 1
return True
except Exception as e:
print(f"✗ 协议错误事件处理失败: {e}")
return False
def _handle_sync_started(self, data: Dict[str, Any]) -> bool:
"""处理同步开始事件"""
try:
print("✓ 时钟同步已开始")
return True
except Exception as e:
print(f"✗ 同步开始事件处理失败: {e}")
return False
def _handle_sync_completed(self, data: Dict[str, Any]) -> bool:
"""处理同步完成事件"""
try:
offset = data.get("offset", 0.0)
rtt = data.get("rtt", 0.0)
quality = data.get("quality", 0.0)
print(f"✓ 时钟同步已完成 - 偏移: {offset:.3f}s, RTT: {rtt:.3f}s, 质量: {quality:.2f}")
return True
except Exception as e:
print(f"✗ 同步完成事件处理失败: {e}")
return False
def _handle_sync_failed(self, data: Dict[str, Any]) -> bool:
"""处理同步失败事件"""
try:
reason = data.get("reason", "unknown")
error = data.get("error", "")
print(f"✗ 时钟同步失败 - 原因: {reason}, 错误: {error}")
# 记录错误统计
self.event_stats["handler_errors"] += 1
return True
except Exception as e:
print(f"✗ 同步失败事件处理失败: {e}")
return False
def _handle_time_updated(self, data: Dict[str, Any]) -> bool:
"""处理时间更新事件"""
try:
server_time = data.get("server_time", 0.0)
interpolated_time = data.get("interpolated_time", 0.0)
# 可以在这里添加时间更新后的处理逻辑
return True
except Exception as e:
print(f"✗ 时间更新事件处理失败: {e}")
return False
def _handle_sync_quality_changed(self, data: Dict[str, Any]) -> bool:
"""处理同步质量变化事件"""
try:
quality = data.get("quality", 0.0)
offset = data.get("offset", 0.0)
rtt = data.get("rtt", 0.0)
print(f"✓ 同步质量变化 - 质量: {quality:.2f}, 偏移: {offset:.3f}s, RTT: {rtt:.3f}s")
return True
except Exception as e:
print(f"✗ 同步质量变化事件处理失败: {e}")
return False
def _handle_config_loaded(self, data: Dict[str, Any]) -> bool:
"""处理配置加载事件"""
try:
config = data.get("config", {})
timestamp = data.get("timestamp", 0.0)
print(f"✓ 配置已加载 - 时间: {timestamp}")
# 应用配置到各个模块
if self.plugin.config_manager:
self.plugin.config_manager.apply_config_to_modules()
return True
except Exception as e:
print(f"✗ 配置加载事件处理失败: {e}")
return False
def _handle_config_saved(self, data: Dict[str, Any]) -> bool:
"""处理配置保存事件"""
try:
config = data.get("config", {})
timestamp = data.get("timestamp", 0.0)
print(f"✓ 配置已保存 - 时间: {timestamp}")
return True
except Exception as e:
print(f"✗ 配置保存事件处理失败: {e}")
return False
def _handle_config_changed(self, data: Dict[str, Any]) -> bool:
"""处理配置变更事件"""
try:
section = data.get("section")
key = data.get("key")
old_value = data.get("old_value")
new_value = data.get("new_value")
print(f"✓ 配置已变更 - {section}.{key}: {old_value} -> {new_value}")
# 应用配置变更到相应模块
if self.plugin.config_manager:
self.plugin.config_manager.apply_config_to_modules()
return True
except Exception as e:
print(f"✗ 配置变更事件处理失败: {e}")
return False
def _handle_config_error(self, data: Dict[str, Any]) -> bool:
"""处理配置错误事件"""
try:
error = data.get("error", "Unknown config error")
operation = data.get("operation", "unknown")
print(f"✗ 配置错误 - 操作: {operation}, 错误: {error}")
# 记录错误统计
self.event_stats["handler_errors"] += 1
return True
except Exception as e:
print(f"✗ 配置错误事件处理失败: {e}")
return False
def _handle_data_serialized(self, data: Dict[str, Any]) -> bool:
"""处理数据序列化事件"""
try:
format = data.get("format", "unknown")
size = data.get("size", 0)
cached = data.get("cached", False)
print(f"✓ 数据已序列化 - 格式: {format}, 大小: {size}字节 ({'缓存' if cached else ''})")
return True
except Exception as e:
print(f"✗ 数据序列化事件处理失败: {e}")
return False
def _handle_data_deserialized(self, data: Dict[str, Any]) -> bool:
"""处理数据反序列化事件"""
try:
format = data.get("format", "unknown")
size = data.get("size", 0)
print(f"✓ 数据已反序列化 - 格式: {format}, 大小: {size}字节")
return True
except Exception as e:
print(f"✗ 数据反序列化事件处理失败: {e}")
return False
def _handle_serialization_error(self, data: Dict[str, Any]) -> bool:
"""处理序列化错误事件"""
try:
error = data.get("error", "Unknown serialization error")
print(f"✗ 序列化错误: {error}")
# 记录错误统计
self.event_stats["handler_errors"] += 1
return True
except Exception as e:
print(f"✗ 序列化错误事件处理失败: {e}")
return False
def _handle_deserialization_error(self, data: Dict[str, Any]) -> bool:
"""处理反序列化错误事件"""
try:
error = data.get("error", "Unknown deserialization error")
print(f"✗ 反序列化错误: {error}")
# 记录错误统计
self.event_stats["handler_errors"] += 1
return True
except Exception as e:
print(f"✗ 反序列化错误事件处理失败: {e}")
return False
def _handle_prediction_updated(self, data: Dict[str, Any]) -> bool:
"""处理预测更新事件"""
try:
object_id = data.get("object_id")
prediction_time = data.get("prediction_time", 0.0)
print(f"✓ 预测已更新 - 对象: {object_id}, 时间: {prediction_time:.3f}")
return True
except Exception as e:
print(f"✗ 预测更新事件处理失败: {e}")
return False
def _handle_correction_applied(self, data: Dict[str, Any]) -> bool:
"""处理校正应用事件"""
try:
object_id = data.get("object_id")
error = data.get("error", 0.0)
print(f"✓ 校正已应用 - 对象: {object_id}, 误差: {error:.3f}")
return True
except Exception as e:
print(f"✗ 校正应用事件处理失败: {e}")
return False
def _handle_snap_correction(self, data: Dict[str, Any]) -> bool:
"""处理快照校正事件"""
try:
object_id = data.get("object_id")
error = data.get("error", 0.0)
print(f"✓ 快照校正 - 对象: {object_id}, 误差: {error:.3f}")
return True
except Exception as e:
print(f"✗ 快照校正事件处理失败: {e}")
return False
def _handle_prediction_error(self, data: Dict[str, Any]) -> bool:
"""处理预测错误事件"""
try:
object_id = data.get("object_id")
error = data.get("error", "")
print(f"✗ 预测错误 - 对象: {object_id}, 错误: {error}")
# 记录错误统计
self.event_stats["handler_errors"] += 1
return True
except Exception as e:
print(f"✗ 预测错误事件处理失败: {e}")
return False
def get_event_stats(self) -> Dict[str, int]:
"""
获取事件统计信息
Returns:
事件统计字典
"""
return self.event_stats.copy()
def reset_event_stats(self):
"""重置事件统计信息"""
try:
self.event_stats = {
"events_received": 0,
"events_processed": 0,
"events_dropped": 0,
"events_timed_out": 0,
"handler_errors": 0,
"async_tasks": 0,
"coalesced_events": 0
}
print("✓ 事件统计信息已重置")
except Exception as e:
print(f"✗ 事件统计信息重置失败: {e}")
def set_event_config(self, config: Dict[str, Any]) -> bool:
"""
设置事件配置
Args:
config: 事件配置字典
Returns:
是否设置成功
"""
try:
self.event_config.update(config)
print(f"✓ 事件配置已更新: {self.event_config}")
return True
except Exception as e:
print(f"✗ 事件配置设置失败: {e}")
return False
def get_event_config(self) -> Dict[str, Any]:
"""
获取事件配置
Returns:
事件配置字典
"""
return self.event_config.copy()
def _trigger_event_callback(self, callback_type: str, data: Dict[str, Any]):
"""
触发事件回调
Args:
callback_type: 回调类型
data: 回调数据
"""
try:
if callback_type in self.event_callbacks:
for callback in self.event_callbacks[callback_type]:
try:
callback(data)
except Exception as e:
print(f"✗ 事件回调执行失败: {e}")
except Exception as e:
print(f"✗ 事件回调触发失败: {e}")
def register_event_callback(self, callback_type: str, callback: Callable):
"""
注册事件回调
Args:
callback_type: 回调类型
callback: 回调函数
"""
try:
if callback_type in self.event_callbacks:
self.event_callbacks[callback_type].append(callback)
print(f"✓ 事件回调已注册: {callback_type}")
else:
print(f"✗ 无效的回调类型: {callback_type}")
except Exception as e:
print(f"✗ 事件回调注册失败: {e}")
def unregister_event_callback(self, callback_type: str, callback: Callable):
"""
注销事件回调
Args:
callback_type: 回调类型
callback: 回调函数
"""
try:
if callback_type in self.event_callbacks:
if callback in self.event_callbacks[callback_type]:
self.event_callbacks[callback_type].remove(callback)
print(f"✓ 事件回调已注销: {callback_type}")
except Exception as e:
print(f"✗ 事件回调注销失败: {e}")
def clear_event_queue(self):
"""清空事件队列"""
try:
# 清空普通队列
while not self.event_queue.empty():
try:
self.event_queue.get_nowait()
except queue.Empty:
break
# 清空优先级队列
while not self.priority_queue.empty():
try:
self.priority_queue.get_nowait()
except queue.Empty:
break
print("✓ 事件队列已清空")
except Exception as e:
print(f"✗ 事件队列清空失败: {e}")
def get_queue_size(self) -> Dict[str, int]:
"""
获取队列大小
Returns:
队列大小字典
"""
return {
"event_queue": self.event_queue.qsize(),
"priority_queue": self.priority_queue.qsize()
}