mxivideo/python_core/utils/progress/task.py

70 lines
2.2 KiB
Python

#!/usr/bin/env python3
"""
渐进式任务管理
"""
import time
from typing import Optional, Callable
from .types import ProgressInfo
from ..logger import logger
class ProgressiveTask:
"""渐进式任务包装器"""
def __init__(self, task_name: str, total_steps: int = 100):
self.task_name = task_name
self.total_steps = total_steps
self.current_step = 0
self.start_time = None
self.progress_callback: Optional[Callable[[ProgressInfo], None]] = None
def set_progress_callback(self, callback: Callable[[ProgressInfo], None]):
"""设置进度回调"""
self.progress_callback = callback
def start(self):
"""开始任务"""
self.start_time = time.time()
self.current_step = 0
self._report_progress("任务开始")
logger.debug(f"Task started: {self.task_name}")
def update(self, step: int = None, message: str = ""):
"""更新进度"""
if step is not None:
self.current_step = step
else:
self.current_step += 1
self._report_progress(message)
def finish(self, message: str = "任务完成"):
"""完成任务"""
self.current_step = self.total_steps
self._report_progress(message)
logger.debug(f"Task finished: {self.task_name}")
def _report_progress(self, message: str):
"""报告进度"""
if self.progress_callback and self.start_time:
elapsed = time.time() - self.start_time
# 估算剩余时间
if self.current_step > 0:
avg_time_per_step = elapsed / self.current_step
remaining_steps = self.total_steps - self.current_step
estimated_remaining = avg_time_per_step * remaining_steps
else:
estimated_remaining = 0.0
progress = ProgressInfo(
current=self.current_step,
total=self.total_steps,
message=message,
elapsed_time=elapsed,
estimated_remaining=estimated_remaining
)
self.progress_callback(progress)