You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
project/Src/command_center/communication/message_queue.py

65 lines
2.0 KiB

import queue
import threading
from typing import Any, Optional
from datetime import datetime
class MessageQueue:
def __init__(self, maxsize: int = 1000):
self.queue = queue.Queue(maxsize=maxsize)
self.lock = threading.Lock()
self.callbacks = []
def put(self, message: Any):
"""将消息放入队列"""
with self.lock:
try:
self.queue.put_nowait({
'message': message,
'timestamp': datetime.now()
})
self._notify_callbacks()
except queue.Full:
print("消息队列已满,丢弃消息")
def get(self, block: bool = True, timeout: Optional[float] = None) -> Optional[dict]:
"""从队列中获取消息"""
try:
return self.queue.get(block=block, timeout=timeout)
except queue.Empty:
return None
def register_callback(self, callback: callable):
"""注册消息回调函数"""
with self.lock:
self.callbacks.append(callback)
def unregister_callback(self, callback: callable):
"""注销消息回调函数"""
with self.lock:
if callback in self.callbacks:
self.callbacks.remove(callback)
def _notify_callbacks(self):
"""通知所有注册的回调函数"""
for callback in self.callbacks:
try:
callback()
except Exception as e:
print(f"回调函数执行失败: {str(e)}")
def clear(self):
"""清空消息队列"""
with self.lock:
while not self.queue.empty():
try:
self.queue.get_nowait()
except queue.Empty:
break
def size(self) -> int:
"""获取队列大小"""
return self.queue.qsize()
def is_empty(self) -> bool:
"""检查队列是否为空"""
return self.queue.empty()