You've already forked FrameTour-RenderWorker
feat(render): 实现渲染系统v2核心架构
- 添加v2支持的任务类型常量定义 - 更新软件版本至0.0.9 - 定义v2统一音视频编码参数 - 实现系统信息工具get_sys_info_v2方法 - 新增get_capabilities和_get_gpu_info功能 - 创建core模块及TaskHandler抽象基类 - 添加渲染系统设计文档包括集群架构、v2 PRD和Worker PRD - 实现任务处理器抽象基类及接口规范
This commit is contained in:
105
domain/result.py
Normal file
105
domain/result.py
Normal file
@@ -0,0 +1,105 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
任务结果模型
|
||||
|
||||
定义错误码、重试配置、任务结果等数据结构。
|
||||
"""
|
||||
|
||||
from enum import Enum
|
||||
from dataclasses import dataclass
|
||||
from typing import Optional, Dict, Any, List
|
||||
|
||||
|
||||
class ErrorCode(Enum):
|
||||
"""错误码枚举"""
|
||||
E_INPUT_UNAVAILABLE = "E_INPUT_UNAVAILABLE" # 素材不可访问/404
|
||||
E_FFMPEG_FAILED = "E_FFMPEG_FAILED" # FFmpeg 执行失败
|
||||
E_UPLOAD_FAILED = "E_UPLOAD_FAILED" # 上传失败
|
||||
E_SPEC_INVALID = "E_SPEC_INVALID" # renderSpec 非法
|
||||
E_TIMEOUT = "E_TIMEOUT" # 执行超时
|
||||
E_UNKNOWN = "E_UNKNOWN" # 未知错误
|
||||
|
||||
|
||||
# 重试配置
|
||||
RETRY_CONFIG: Dict[ErrorCode, Dict[str, Any]] = {
|
||||
ErrorCode.E_INPUT_UNAVAILABLE: {
|
||||
'max_retries': 3,
|
||||
'backoff': [1, 2, 5] # 重试间隔(秒)
|
||||
},
|
||||
ErrorCode.E_FFMPEG_FAILED: {
|
||||
'max_retries': 2,
|
||||
'backoff': [1, 3]
|
||||
},
|
||||
ErrorCode.E_UPLOAD_FAILED: {
|
||||
'max_retries': 3,
|
||||
'backoff': [1, 2, 5]
|
||||
},
|
||||
ErrorCode.E_SPEC_INVALID: {
|
||||
'max_retries': 0, # 不重试
|
||||
'backoff': []
|
||||
},
|
||||
ErrorCode.E_TIMEOUT: {
|
||||
'max_retries': 2,
|
||||
'backoff': [5, 10]
|
||||
},
|
||||
ErrorCode.E_UNKNOWN: {
|
||||
'max_retries': 1,
|
||||
'backoff': [2]
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@dataclass
|
||||
class TaskResult:
|
||||
"""
|
||||
任务结果
|
||||
|
||||
封装任务执行的结果,包括成功数据或失败信息。
|
||||
"""
|
||||
success: bool
|
||||
data: Optional[Dict[str, Any]] = None
|
||||
error_code: Optional[ErrorCode] = None
|
||||
error_message: Optional[str] = None
|
||||
|
||||
@classmethod
|
||||
def ok(cls, data: Dict[str, Any]) -> 'TaskResult':
|
||||
"""创建成功结果"""
|
||||
return cls(success=True, data=data)
|
||||
|
||||
@classmethod
|
||||
def fail(cls, error_code: ErrorCode, error_message: str) -> 'TaskResult':
|
||||
"""创建失败结果"""
|
||||
return cls(
|
||||
success=False,
|
||||
error_code=error_code,
|
||||
error_message=error_message
|
||||
)
|
||||
|
||||
def to_report_dict(self) -> Dict[str, Any]:
|
||||
"""
|
||||
转换为上报格式
|
||||
|
||||
用于 API 上报时的数据格式转换。
|
||||
"""
|
||||
if self.success:
|
||||
return {'result': self.data}
|
||||
else:
|
||||
return {
|
||||
'errorCode': self.error_code.value if self.error_code else 'E_UNKNOWN',
|
||||
'errorMessage': self.error_message or 'Unknown error'
|
||||
}
|
||||
|
||||
def can_retry(self) -> bool:
|
||||
"""是否可以重试"""
|
||||
if self.success:
|
||||
return False
|
||||
if not self.error_code:
|
||||
return True
|
||||
config = RETRY_CONFIG.get(self.error_code, {})
|
||||
return config.get('max_retries', 0) > 0
|
||||
|
||||
def get_retry_config(self) -> Dict[str, Any]:
|
||||
"""获取重试配置"""
|
||||
if not self.error_code:
|
||||
return {'max_retries': 1, 'backoff': [2]}
|
||||
return RETRY_CONFIG.get(self.error_code, {'max_retries': 1, 'backoff': [2]})
|
||||
Reference in New Issue
Block a user