Files
work-secretfile-selfcheck/UmiOCR-data/py_src/mission/mission_queue.py

100 lines
3.1 KiB
Python
Raw Normal View History

# 任务队列类
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