Coverage for merco/scheduler/jobs.py: 0%
46 statements
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-07 14:04 +0800
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-07 14:04 +0800
1"""任务管理"""
3from dataclasses import dataclass, field
4from datetime import datetime
5from typing import Optional
6from enum import Enum
9class TaskStatus(str, Enum):
10 PENDING = "pending"
11 RUNNING = "running"
12 COMPLETED = "completed"
13 FAILED = "failed"
14 CANCELLED = "cancelled"
17@dataclass
18class Task:
19 """任务对象"""
20 id: str
21 name: str
22 description: str
23 status: TaskStatus = TaskStatus.PENDING
24 created_at: datetime = field(default_factory=datetime.now)
25 started_at: Optional[datetime] = None
26 completed_at: Optional[datetime] = None
27 result: Optional[str] = None
28 error: Optional[str] = None
31class TaskManager:
32 """任务管理器"""
34 def __init__(self):
35 self._tasks: dict[str, Task] = {}
37 def create(self, name: str, description: str) -> Task:
38 """创建任务"""
39 import uuid
40 task = Task(id=str(uuid.uuid4())[:8], name=name, description=description)
41 self._tasks[task.id] = task
42 return task
44 def get(self, task_id: str) -> Optional[Task]:
45 """获取任务"""
46 return self._tasks.get(task_id)
48 def update_status(self, task_id: str, status: TaskStatus, result: str = None, error: str = None):
49 """更新任务状态"""
50 task = self._tasks.get(task_id)
51 if task:
52 task.status = status
53 task.result = result
54 task.error = error
55 if status == TaskStatus.RUNNING:
56 task.started_at = datetime.now()
57 elif status in (TaskStatus.COMPLETED, TaskStatus.FAILED, TaskStatus.CANCELLED):
58 task.completed_at = datetime.now()
60 def list_tasks(self, status: TaskStatus = None) -> list[Task]:
61 """列出任务"""
62 tasks = list(self._tasks.values())
63 if status:
64 tasks = [t for t in tasks if t.status == status]
65 return tasks