import queue import threading import time import models.msg from upload.RateLimiter import RateLimiter class DataReporter(threading.Thread): call_back=None def __init__(self,data_fps:int,video_fps:int): super().__init__() self.image_queue = queue.Queue(maxsize=video_fps) # 图片队列 self.data_queue = queue.Queue(maxsize=data_fps) # 数据队列 self.image_limiter = RateLimiter(max_rate=video_fps, time_window=1) # 图片限速: 5张/秒 self.data_limiter = RateLimiter(max_rate=data_fps, time_window=1) # 数据限速: 20条/秒 self.running = True self.image_dropped = 0 # 统计丢弃的图片数量 self.data_dropped = 0 # 统计丢弃的数据数量 def register_handler(self,handler_fun): self.call_back = handler_fun def run(self): while self.running: # 优先处理图片上报 if not self.image_queue.empty() and self.image_limiter.allow_request(): try: image_data = self.image_queue.get_nowait() self._report_image(image_data) except queue.Empty: pass # 然后处理数据上报 if not self.data_queue.empty() and self.data_limiter.allow_request(): try: data = self.data_queue.get_nowait() self._report_data(data) except queue.Empty: pass time.sleep(0.02) # 避免CPU占用过高 def _report_image(self, data): # 实现图片上报逻辑 print(f"Reporting image, timestamp: {data[0]}") # 这里替换为实际的上报代码 msg = models.msg.Msg(_from="dev", cmd="image", values=data[1]) msg_json = msg.to_json() self.call_back(msg_json) def _report_data(self, data): # 实现数据上报逻辑 print(f"Reporting data: {data}") # 实际的上报代码,数据结构转换 msg=models.msg.Msg(_from="dev",cmd="data",values=data[1]) msg_json=msg.to_json() self.call_back(msg_json) def stop(self): self.running = False self.join() print(f"Stats: {self.image_dropped} images dropped, {self.data_dropped} data dropped") def adjust_rate(self, new_rate, data_type='image'): if data_type == 'image': with self.image_limiter.lock: self.image_limiter.max_rate = new_rate self.image_queue= queue.Queue(maxsize=new_rate) else: with self.data_limiter.lock: self.data_limiter.max_rate = new_rate self.data_queue = queue.Queue(maxsize=new_rate)