Files
we-mp-rss/core/queue/queue.py
T
2025-11-04 00:36:51 +08:00

130 lines
4.7 KiB
Python
Executable File

import queue
import threading
import time
import gc
from typing import Callable, Any, Optional
from core.print import print_error, print_info, print_warning, print_success
class TaskQueueManager:
"""任务队列管理器,用于管理和执行排队任务"""
def __init__(self,maxsize=0,tag:str=""):
"""初始化任务队列"""
self._queue = queue.Queue(maxsize=maxsize)
self._lock = threading.Lock()
self._is_running = False
self.tag=tag
def add_task(self, task: Callable[..., Any], *args: Any, **kwargs: Any) -> None:
"""添加任务到队列
Args:
task: 要执行的任务函数
*args: 任务函数的参数
**kwargs: 任务函数的关键字参数
"""
with self._lock:
self._queue.put((task, args, kwargs))
print_success(f"{self.tag}队列任务添加成功\n")
def run_task_background(self)->None:
threading.Thread(target=self.run_tasks, daemon=True).start()
print_warning("队列任务后台运行")
def run_tasks(self, timeout: float = 1.0) -> None:
"""执行队列中的所有任务,并持续运行以接收新任务
Args:
timeout: 等待新任务的超时时间(秒)
"""
with self._lock:
if self._is_running:
return
self._is_running = True
try:
while self._is_running:
time.sleep(0.1) # 避免过于频繁的任务获取
try:
# 阻塞获取任务,避免CPU空转
task, args, kwargs = self._queue.get(timeout=timeout)
try:
# 记录任务开始时间
start_time = time.time()
task(*args, **kwargs)
# 记录任务执行时间
duration = time.time() - start_time
print_info(f"\n任务执行完成,耗时: {duration:.2f}秒")
except Exception as e:
print_error(f"队列任务执行失败: {e}")
# raise
finally:
# 确保任务完成标记和资源释放
self._queue.task_done()
# 强制垃圾回收
gc.collect()
except queue.Empty:
# 超时无任务,继续检查运行状态
continue
finally:
# 确保停止状态设置和资源清理
with self._lock:
self._is_running = False
# 清理可能残留的资源
gc.collect()
def stop(self) -> None:
"""停止任务执行"""
with self._lock:
self._is_running = False
def get_queue_info(self) -> dict:
"""
获取队列的当前状态信息
返回:
dict: 包含队列信息的字典,包括:
- is_running: 队列是否正在运行
- pending_tasks: 等待执行的任务数量
"""
with self._lock:
return {
'is_running': self._is_running,
'pending_tasks': self._queue.qsize()
}
def clear_queue(self) -> None:
"""清空队列中的所有任务"""
with self._lock:
while not self._queue.empty():
try:
self._queue.get_nowait()
self._queue.task_done()
except queue.Empty:
break
print_success("队列已清空")
def delete_queue(self) -> None:
"""删除队列(停止并清空所有任务)"""
with self._lock:
self._is_running = False
while not self._queue.empty():
try:
self._queue.get_nowait()
self._queue.task_done()
except queue.Empty:
break
print_success("队列已删除")
TaskQueue = TaskQueueManager(tag="默认队列")
TaskQueue.run_task_background()
if __name__ == "__main__":
def task1():
print("执行任务1")
def task2(name):
print(f"执行任务2,参数: {name}")
manager = TaskQueueManager()
manager.add_task(task1)
manager.add_task(task2, "测试任务")
manager.run_tasks() # 按顺序执行任务1和任务2