70 lines
2.2 KiB
Python
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)
|