# 任务队列类 from uuid import uuid4 from typing import Callable, Any from umi_log import logger class MissionQueue: def __init__( self, msnList: list, # 任务内容列表,每项为一个任务元素 configs: dict = {}, # 任务控制参数 # 回调函数 # 整个队列 即将启动。回调参数(self) onStart: Callable[["MissionQueue"], None] = None, # 单个任务 准备进行。回调参数(self, 任务元素) onReady: Callable[["MissionQueue", Any], None] = None, # 单个任务 完成。回调参数(self, 任务元素, 任务结果) onGet: Callable[["MissionQueue"], None] = None, # 整个队列 已结束。回调参数(self, 结果标志) # 结果标志:"[Success]...", "[Warning]...", "[Error]..." onEnd: Callable[["MissionQueue", str], None] = None, ): self.msnList = msnList self.configs = configs self.id = str(uuid4()) # 任务ID self.len = len(msnList) # 队列总长度 self.index = 0 # 当前任务下标 self._onStart = onStart if onStart else self._pass self._onReady = onReady if onReady else self._pass self._onGet = onGet if onGet else self._pass self._onEnd = onEnd if onEnd else self._pass # 工作状态: "waiting" "running" self.state_work = "waiting" # 控制状态: "" "pause" "stop" self.state_ctrl = "" # ==================== mission调用 ==================== # 获取剩余任务长度 def remainingLen(self): return self.len - self.index # 判空 【1】←在一轮任务循环中的调用顺序 def empty(self): return self.index >= self.len # 获取一个任务元素 【2】 def getMsn(self): return self.msnList[self.index] # 完成一个任务元素 【5】 def popMsn(self): self.index += 1 # 恢复进行 def resume(self): if self.state_ctrl == "pause": self.state_ctrl = "" # 暂停 def pause(self): self.state_ctrl = "pause" # 停止(废弃) def stop(self): self.state_ctrl = "stop" # ==================== 回调函数 ==================== def onStart(self): try: self._onStart(self) except Exception: logger.error("任务 onStart 回调异常。", exc_info=True, stack_info=True) def onReady(self): # 【3】 try: self._onReady(self) except Exception: logger.error("任务 onReady 回调异常。", exc_info=True, stack_info=True) def onGet(self, res): # 【4】 try: self._onGet(self, res) except Exception: logger.error("任务 onGet 回调异常。", exc_info=True, stack_info=True) def onEnd(self, flag): # 结果标志:"[Success]...", "[Warning]...", "[Error]..." try: self._onEnd(self, flag) except Exception: logger.error("任务 onEnd 回调异常。", exc_info=True, stack_info=True) @staticmethod def _pass(*e): # 空函数 pass