变更内容: - 增加 `max_concurrent_jobs` 配置项,支持设置最大并发任务数。 - 为 `JobManager` 添加信号量控制实现任务并发限制。 - 新增获取任务并发状态的接口 `/jobs/concurrency/status`。 - 编写并发控制功能相关的测试用
173 lines
5.5 KiB
Python
173 lines
5.5 KiB
Python
"""API 数据模型"""
|
||
|
||
from enum import Enum
|
||
from pydantic import BaseModel, Field, ConfigDict
|
||
from typing import Any, Dict, Optional
|
||
|
||
|
||
class InvokeRequest(BaseModel):
|
||
"""同步调用请求"""
|
||
|
||
model_config = ConfigDict(json_schema_extra={"example": {"number": 17}})
|
||
|
||
number: int = Field(..., description="待判断的整数")
|
||
|
||
|
||
class InvokeResponse(BaseModel):
|
||
"""同步调用响应"""
|
||
|
||
model_config = ConfigDict(
|
||
json_schema_extra={
|
||
"example": {
|
||
"request_id": "550e8400-e29b-41d4-a716-446655440000",
|
||
"status": "success",
|
||
"result": {
|
||
"number": 17,
|
||
"is_prime": True,
|
||
"factors": [],
|
||
"algorithm": "trial_division",
|
||
},
|
||
"metadata": {
|
||
"algorithm": "PrimeChecker",
|
||
"version": "1.0.0",
|
||
"elapsed_time": 0.001,
|
||
},
|
||
}
|
||
}
|
||
)
|
||
|
||
request_id: str = Field(..., description="请求唯一标识")
|
||
status: str = Field(..., description="处理状态")
|
||
result: Dict[str, Any] = Field(..., description="算法执行结果")
|
||
metadata: Dict[str, Any] = Field(..., description="元数据信息")
|
||
|
||
|
||
class HealthResponse(BaseModel):
|
||
"""健康检查响应"""
|
||
|
||
status: str = Field(..., description="健康状态")
|
||
timestamp: float = Field(..., description="时间戳")
|
||
|
||
|
||
class ReadinessResponse(BaseModel):
|
||
"""就绪检查响应"""
|
||
|
||
status: str = Field(..., description="就绪状态")
|
||
timestamp: float = Field(..., description="时间戳")
|
||
checks: Optional[Dict[str, bool]] = Field(None, description="各项检查结果")
|
||
|
||
|
||
class ErrorResponse(BaseModel):
|
||
"""错误响应"""
|
||
|
||
model_config = ConfigDict(
|
||
json_schema_extra={
|
||
"example": {
|
||
"error": "VALIDATION_ERROR",
|
||
"message": "number must be an integer",
|
||
"details": {"field": "number", "value": "abc"},
|
||
"request_id": "550e8400-e29b-41d4-a716-446655440000",
|
||
}
|
||
}
|
||
)
|
||
|
||
error: str = Field(..., description="错误代码")
|
||
message: str = Field(..., description="错误消息")
|
||
details: Optional[Dict[str, Any]] = Field(None, description="错误详情")
|
||
request_id: Optional[str] = Field(None, description="请求ID")
|
||
|
||
|
||
class JobStatus(str, Enum):
|
||
"""任务状态枚举"""
|
||
|
||
PENDING = "pending" # 等待执行
|
||
RUNNING = "running" # 执行中
|
||
COMPLETED = "completed" # 已完成
|
||
FAILED = "failed" # 执行失败
|
||
|
||
|
||
class JobRequest(BaseModel):
|
||
"""异步任务请求"""
|
||
|
||
model_config = ConfigDict(
|
||
json_schema_extra={
|
||
"example": {
|
||
"algorithm": "PrimeChecker",
|
||
"params": {"number": 17},
|
||
"webhook": "https://example.com/callback",
|
||
}
|
||
}
|
||
)
|
||
|
||
algorithm: str = Field(..., description="算法名称")
|
||
params: Dict[str, Any] = Field(..., description="算法参数")
|
||
webhook: Optional[str] = Field(None, description="回调 URL")
|
||
|
||
|
||
class JobCreateResponse(BaseModel):
|
||
"""任务创建响应"""
|
||
|
||
model_config = ConfigDict(
|
||
json_schema_extra={
|
||
"example": {
|
||
"job_id": "a1b2c3d4e5f6",
|
||
"status": "pending",
|
||
"message": "任务已创建",
|
||
"created_at": "2026-02-02T10:00:00Z",
|
||
}
|
||
}
|
||
)
|
||
|
||
job_id: str = Field(..., description="任务唯一标识")
|
||
status: JobStatus = Field(..., description="任务状态")
|
||
message: str = Field(..., description="状态消息")
|
||
created_at: str = Field(..., description="创建时间(ISO 8601)")
|
||
|
||
|
||
class JobStatusResponse(BaseModel):
|
||
"""任务状态查询响应"""
|
||
|
||
model_config = ConfigDict(
|
||
json_schema_extra={
|
||
"example": {
|
||
"job_id": "a1b2c3d4e5f6",
|
||
"status": "completed",
|
||
"algorithm": "PrimeChecker",
|
||
"created_at": "2026-02-02T10:00:00Z",
|
||
"started_at": "2026-02-02T10:00:01Z",
|
||
"completed_at": "2026-02-02T10:00:02Z",
|
||
"result": {"number": 17, "is_prime": True},
|
||
"error": None,
|
||
"metadata": {"elapsed_time": 0.001},
|
||
}
|
||
}
|
||
)
|
||
|
||
job_id: str = Field(..., description="任务唯一标识")
|
||
status: JobStatus = Field(..., description="任务状态")
|
||
algorithm: str = Field(..., description="算法名称")
|
||
created_at: str = Field(..., description="创建时间(ISO 8601)")
|
||
started_at: Optional[str] = Field(None, description="开始执行时间(ISO 8601)")
|
||
completed_at: Optional[str] = Field(None, description="完成时间(ISO 8601)")
|
||
result: Optional[Dict[str, Any]] = Field(None, description="执行结果(仅完成时返回)")
|
||
error: Optional[str] = Field(None, description="错误信息(仅失败时返回)")
|
||
metadata: Optional[Dict[str, Any]] = Field(None, description="元数据信息")
|
||
|
||
|
||
class ConcurrencyStatusResponse(BaseModel):
|
||
"""并发状态响应"""
|
||
|
||
model_config = ConfigDict(
|
||
json_schema_extra={
|
||
"example": {
|
||
"max_concurrent": 10,
|
||
"available_slots": 7,
|
||
"running_jobs": 3,
|
||
}
|
||
}
|
||
)
|
||
|
||
max_concurrent: int = Field(..., description="最大并发任务数")
|
||
available_slots: int = Field(..., description="当前可用槽位数")
|
||
running_jobs: int = Field(..., description="当前运行中的任务数")
|