# MaaS 任务退避重试框架
[](https://www.python.org/)
[](LICENSE)
一个基于Redis的分布式任务退避重试、调度框架,支持多种退避策略和并发执行。
## ✨ 核心特性
- 🔄 **多种退避策略**: 固定间隔、指数退避、线性退避
- 🚀 **高并发执行**: 支持线程池/进程池并发处理
- 📊 **任务优先级**: 支持任务优先级管理
- ⏱️ **超时控制**: 任务执行超时和失败处理
- 📈 **状态监控**: 完整的任务状态管理和监控
- 🎯 **灵活调度**: 可配置的定时调度间隔
- 🔒 **分布式锁**: 基于Redis的分布式任务队列
## 📦 安装
```bash
pip install maas-backoff-scheduler
```
## 🚀 快速开始
### 使用示例
```python
from backoff.scheduler.backoff_scheduler import (
TaskBackoffScheduler,
TaskBackoffConfig,
TaskEntity,
TaskConfig,
StorageConfig,
ThreadPoolConfig,
SchedulerConfig,
ResultEntity,
)
# 1. 创建配置
config = TaskBackoffConfig()
# Redis存储配置
config.storage = StorageConfig(
type="redis",
host="localhost",
port=6379,
database=0,
password=""
)
# 任务配置
config.task = TaskConfig(
biz_prefix="my_service",
batch_size=10,
max_retry_count=3,
backoff_strategy="exponential",
backoff_interval=30,
backoff_multiplier=2.0,
min_gpu_memory_gb=0.5,
min_gpu_utilization=10
)
# 线程池配置
config.threadpool = ThreadPoolConfig(
concurrency=5,
exec_timeout=300,
proc_mode="process"
)
# 调度器配置
config.scheduler = SchedulerConfig(interval=10)
# 2. 创建调度器
scheduler = TaskBackoffScheduler(config)
# 3. 定义任务处理器
def task_handler(task: TaskEntity):
# 您的业务逻辑
print(f"处理任务: {task.task_id}")
return ResultEntity.ok(
result={"status": "success", "data": "处理完成"},
task_id=task.task_id,
)
def exception_handler(task: TaskEntity):
# 异常处理逻辑
return ResultEntity.fail(
code=-1,
message="任务执行失败",
task_id=task.task_id,
)
# 4. 注册处理器
scheduler.set_custom_task_handler(task_handler)
scheduler.set_custom_task_exception_handler(exception_handler)
# 5. 启动调度器(如果不需要启动调度器,请忽略此步骤,只提供基础的Task API操作)
scheduler.start()
```
## 📚 API 参考
### 任务管理
#### 1.创建任务
```python
task_id = scheduler.create_task(
task_params={"key": "value"},
task_id="unique_task_id"
)
```
#### 2.查询任务
```python
task = scheduler.get_task(task_id)
```
task任务结构
```python
{
"task_id": "task_5775520148",
"process": 0,
"status": "pending",
"result": "",
"param": "{\"index\": 111, \"data\": \"test_data\"}",
"retry_count": 0,
"next_execution_time": 0,
"create_time": 1756695076,
"update_time": 1756695076,
"max_retry_count": 5,
"backoff_strategy": "fixed",
"backoff_interval": 60,
"backoff_multiplier": 2.0,
"min_gpu_memory_gb": 0,
"min_gpu_utilization": 0.0,
"biz_prefix": "custom_scheduling_example"
}
```
字段说明
| 字段 | 类型 | 说明 |
|----------|--------|----------------|
| task_id | string | 任务唯一id |
| biz_prefix | string | 任务的业务前缀 |
| process | int | 任务进度 |
| status | string | 任务状态 |
| result | string | 任务的执行结果 |
| param | string | 任务的参数 |
| retry_count | int | 重试次数 |
| next_execution_time | int | 下次执行时间 |
| create_time | int | 创建时间 |
| update_time | int | 更新时间 |
| update_time | int | 更新时间 |
| max_retry_count | int | 最大重试次数 |
| backoff_strategy | string | 退避类型 |
| backoff_interval | int | 退避间隔 |
| backoff_multiplier | int | 退避倍数 |
| min_gpu_memory_gb | int | 需要的最小GPU内存 |
| min_gpu_utilization | int | 需要的最小GPU使用率 |
#### 3.撤销任务
仅限`pending`状态任务,已开始任务无法撤销
```python
bool = scheduler.cancel_task(task_id)
```
#### 4.获取队列统计
```python
stats = scheduler.get_queue_statistics()
```
队列统计结构
```python
{
"system_status": {
"update_time": "2025-09-01 15:30:13"
},
"tasks": {
"pending": {
"total": 34,
"queue": [
"task_2728059290",
"task_2829088805"
]
},
"processing": {
"total": 0,
"queue": []
},
"completed": {
"total": 0,
"queue": []
},
"failed": {
"total": 0,
"queue": []
}
}
}
```
字段说明
| 字段 | 类型 | 说明 |
|----------|--------|----------------|
| update_time | string | 请求时间 |
| tasks | object | 任务队列统计 |
| pending | object | 等待队列 |
| processing | object | 处理中队列 |
| completed | object | 已完成队列 |
| failed | object | 失败队列 |
| total | int | 任务队列总数 |
| queue | list | 任务队列详情列表 |
### 5.更任务状态
```python
# 标记任务完成
bool = scheduler.mark_task_completed(task_id, "执行结果")
# 标记任务失败
bool = scheduler.mark_task_failed(task_id, "失败原因")
# 标记任务处理中
bool = scheduler.mark_task_processing(task_id)
```
### 6.更新任务进度
```python
# 更新任务进度
bool = scheduler.update_task_progress(task_id, 75) # 75%
```
### 7.调度器控制
如果不执行`scheduler.start()`则不会启动调度器,只提供基础的Task API操作功能
```python
# 启动调度器
scheduler.start()
# 关闭调度器
scheduler.shutdown()
```
### 8.处理器管理
- **任务处理器** (`set_custom_task_handler`): 可选设置,处理正常的业务逻辑
- **异常处理器** (`set_custom_task_exception_handler`): 可选设置,处理任务执行过程中的异常情况
```python
# 注册任务处理器(可选)
scheduler.set_custom_task_handler(task_handler)
# 注册异常处理器(可选)
scheduler.set_custom_task_exception_handler(exception_handler)
```
**处理器函数签名**
```python
from backoff.scheduler.backoff_scheduler import (
TaskEntity,
ResultEntity,
)
def task_handler(task: TaskEntity) -> ResultEntity:
# 您的业务逻辑
pass
def exception_handler(task: TaskEntity) -> ResultEntity:
# 异常处理逻辑
pass
```
#### 返回值示例
**成功处理:**
```python
return ResultEntity.ok(
result={"status": "success", "data": "处理结果"},
task_id=task.task_id,
)
```
**失败处理:**
```python
return ResultEntity.fail(
code=-1,
message="任务执行失败",
result={"error": "具体错误信息"},
task_id=task.task_id,
)
```
## ⚙️ 配置详解
### StorageConfig (存储配置)
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|----------|--------|------|-----------|----------------|
| type | string | 是 | redis | 存储类型,目前仅支持Redis |
| host | string | 是 | - | Redis主机地址 |
| port | int | 是 | 6379 | Redis端口 |
| database | int | 否 | 0 | Redis数据库 |
| password | string | 否 | "" | Redis密码 |
### TaskConfig (任务配置)
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---------------------|--------|------|---------------|-------------------------|
| biz_prefix | string | 是 | - | 业务前缀 |
| max_retry_count | int | 否 | 3 | 最大重试次数 |
| backoff_strategy | string | 否 | exponential | 退避策略 |
| backoff_interval | int | 否 | 30 | 初始退避间隔(秒) |
| backoff_multiplier | float | 否 | 2.0 | 退避倍数 |
| batch_size | int | 否 | 100 | 批次大小 |
| min_gpu_memory_gb | float | 否 | 0 | 最小GPU内存(GB) |
| min_gpu_utilization | int | 否 | 0 | 最小GPU利用率(%) |
**退避策略说明:**
- `fixed`: 固定间隔重试
- `exponential`: 指数退避 (默认)
- `linear`: 线性退避
### ThreadPoolConfig (线程池配置)
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---------------|--------|------|--------|-------------------------|
| concurrency | int | 否 | 10 | 并发线程/进程数 |
| proc_mode | string | 否 | thread | 执行模式 |
| exec_timeout | int | 否 | 300 | 任务超时时间(秒) |
**执行模式说明:**
- `thread`: 线程池模式 (适合IO密集型任务)
- `process`: 进程池模式 (适合CPU密集型任务,默认)
### SchedulerConfig (调度器配置)
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|----------|------|------|--------|----------------|
| interval | int | 否 | 10 | 轮询间隔(秒) |
Raw data
{
"_id": null,
"home_page": "https://github.com/xiaofucoding/maas-backoff-scheduler.git/",
"name": "maas-backoff-scheduler",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "task retry backoff redis queue",
"author": "xinzf",
"author_email": "515361725@qq.com",
"download_url": "https://files.pythonhosted.org/packages/77/5c/45cdda6a9d41a07a8babd75f41816ae52166d0d52fe230b55a9116a295cb/maas-backoff-scheduler-1.1.11.tar.gz",
"platform": null,
"description": "# MaaS \u4efb\u52a1\u9000\u907f\u91cd\u8bd5\u6846\u67b6\n\n[](https://www.python.org/)\n[](LICENSE)\n\n\u4e00\u4e2a\u57fa\u4e8eRedis\u7684\u5206\u5e03\u5f0f\u4efb\u52a1\u9000\u907f\u91cd\u8bd5\u3001\u8c03\u5ea6\u6846\u67b6\uff0c\u652f\u6301\u591a\u79cd\u9000\u907f\u7b56\u7565\u548c\u5e76\u53d1\u6267\u884c\u3002\n\n## \u2728 \u6838\u5fc3\u7279\u6027\n\n- \ud83d\udd04 **\u591a\u79cd\u9000\u907f\u7b56\u7565**: \u56fa\u5b9a\u95f4\u9694\u3001\u6307\u6570\u9000\u907f\u3001\u7ebf\u6027\u9000\u907f\n- \ud83d\ude80 **\u9ad8\u5e76\u53d1\u6267\u884c**: \u652f\u6301\u7ebf\u7a0b\u6c60/\u8fdb\u7a0b\u6c60\u5e76\u53d1\u5904\u7406\n- \ud83d\udcca **\u4efb\u52a1\u4f18\u5148\u7ea7**: \u652f\u6301\u4efb\u52a1\u4f18\u5148\u7ea7\u7ba1\u7406\n- \u23f1\ufe0f **\u8d85\u65f6\u63a7\u5236**: \u4efb\u52a1\u6267\u884c\u8d85\u65f6\u548c\u5931\u8d25\u5904\u7406\n- \ud83d\udcc8 **\u72b6\u6001\u76d1\u63a7**: \u5b8c\u6574\u7684\u4efb\u52a1\u72b6\u6001\u7ba1\u7406\u548c\u76d1\u63a7\n- \ud83c\udfaf **\u7075\u6d3b\u8c03\u5ea6**: \u53ef\u914d\u7f6e\u7684\u5b9a\u65f6\u8c03\u5ea6\u95f4\u9694\n- \ud83d\udd12 **\u5206\u5e03\u5f0f\u9501**: \u57fa\u4e8eRedis\u7684\u5206\u5e03\u5f0f\u4efb\u52a1\u961f\u5217\n\n## \ud83d\udce6 \u5b89\u88c5\n\n```bash\npip install maas-backoff-scheduler\n```\n\n## \ud83d\ude80 \u5feb\u901f\u5f00\u59cb\n\n### \u4f7f\u7528\u793a\u4f8b\n\n```python\nfrom backoff.scheduler.backoff_scheduler import (\n TaskBackoffScheduler,\n TaskBackoffConfig,\n TaskEntity,\n TaskConfig,\n StorageConfig,\n ThreadPoolConfig,\n SchedulerConfig,\n ResultEntity,\n)\n\n# 1. \u521b\u5efa\u914d\u7f6e\nconfig = TaskBackoffConfig()\n\n# Redis\u5b58\u50a8\u914d\u7f6e\nconfig.storage = StorageConfig(\n type=\"redis\", \n host=\"localhost\", \n port=6379, \n database=0, \n password=\"\"\n)\n\n# \u4efb\u52a1\u914d\u7f6e\nconfig.task = TaskConfig(\n biz_prefix=\"my_service\",\n batch_size=10,\n max_retry_count=3,\n backoff_strategy=\"exponential\",\n backoff_interval=30,\n backoff_multiplier=2.0,\n min_gpu_memory_gb=0.5,\n min_gpu_utilization=10\n)\n\n# \u7ebf\u7a0b\u6c60\u914d\u7f6e\nconfig.threadpool = ThreadPoolConfig(\n concurrency=5, \n exec_timeout=300, \n proc_mode=\"process\"\n)\n\n# \u8c03\u5ea6\u5668\u914d\u7f6e\nconfig.scheduler = SchedulerConfig(interval=10)\n\n# 2. \u521b\u5efa\u8c03\u5ea6\u5668\nscheduler = TaskBackoffScheduler(config)\n\n# 3. \u5b9a\u4e49\u4efb\u52a1\u5904\u7406\u5668\ndef task_handler(task: TaskEntity):\n # \u60a8\u7684\u4e1a\u52a1\u903b\u8f91\n print(f\"\u5904\u7406\u4efb\u52a1: {task.task_id}\")\n return ResultEntity.ok(\n result={\"status\": \"success\", \"data\": \"\u5904\u7406\u5b8c\u6210\"},\n task_id=task.task_id,\n )\n\ndef exception_handler(task: TaskEntity):\n # \u5f02\u5e38\u5904\u7406\u903b\u8f91\n return ResultEntity.fail(\n code=-1,\n message=\"\u4efb\u52a1\u6267\u884c\u5931\u8d25\",\n task_id=task.task_id,\n )\n\n# 4. \u6ce8\u518c\u5904\u7406\u5668\nscheduler.set_custom_task_handler(task_handler)\n\nscheduler.set_custom_task_exception_handler(exception_handler)\n\n# 5. \u542f\u52a8\u8c03\u5ea6\u5668\uff08\u5982\u679c\u4e0d\u9700\u8981\u542f\u52a8\u8c03\u5ea6\u5668\uff0c\u8bf7\u5ffd\u7565\u6b64\u6b65\u9aa4\uff0c\u53ea\u63d0\u4f9b\u57fa\u7840\u7684Task API\u64cd\u4f5c\uff09\nscheduler.start()\n```\n\n## \ud83d\udcda API \u53c2\u8003\n\n### \u4efb\u52a1\u7ba1\u7406\n\n#### 1.\u521b\u5efa\u4efb\u52a1\n\n```python\ntask_id = scheduler.create_task(\n task_params={\"key\": \"value\"},\n task_id=\"unique_task_id\"\n)\n```\n\n#### 2.\u67e5\u8be2\u4efb\u52a1\n\n```python\ntask = scheduler.get_task(task_id)\n```\n\ntask\u4efb\u52a1\u7ed3\u6784\n\n```python\n{\n \"task_id\": \"task_5775520148\",\n \"process\": 0,\n \"status\": \"pending\",\n \"result\": \"\",\n \"param\": \"{\\\"index\\\": 111, \\\"data\\\": \\\"test_data\\\"}\",\n \"retry_count\": 0,\n \"next_execution_time\": 0,\n \"create_time\": 1756695076,\n \"update_time\": 1756695076,\n \"max_retry_count\": 5,\n \"backoff_strategy\": \"fixed\",\n \"backoff_interval\": 60,\n \"backoff_multiplier\": 2.0,\n \"min_gpu_memory_gb\": 0,\n \"min_gpu_utilization\": 0.0,\n \"biz_prefix\": \"custom_scheduling_example\"\n}\n```\n\n\u5b57\u6bb5\u8bf4\u660e\n\n| \u5b57\u6bb5 | \u7c7b\u578b | \u8bf4\u660e |\n|----------|--------|----------------|\n| task_id | string | \u4efb\u52a1\u552f\u4e00id |\n| biz_prefix | string | \u4efb\u52a1\u7684\u4e1a\u52a1\u524d\u7f00 |\n| process | int | \u4efb\u52a1\u8fdb\u5ea6 |\n| status | string | \u4efb\u52a1\u72b6\u6001 |\n| result | string | \u4efb\u52a1\u7684\u6267\u884c\u7ed3\u679c |\n| param | string | \u4efb\u52a1\u7684\u53c2\u6570 |\n| retry_count | int | \u91cd\u8bd5\u6b21\u6570 |\n| next_execution_time | int | \u4e0b\u6b21\u6267\u884c\u65f6\u95f4 |\n| create_time | int | \u521b\u5efa\u65f6\u95f4 |\n| update_time | int | \u66f4\u65b0\u65f6\u95f4 |\n| update_time | int | \u66f4\u65b0\u65f6\u95f4 |\n| max_retry_count | int | \u6700\u5927\u91cd\u8bd5\u6b21\u6570 |\n| backoff_strategy | string | \u9000\u907f\u7c7b\u578b |\n| backoff_interval | int | \u9000\u907f\u95f4\u9694 |\n| backoff_multiplier | int | \u9000\u907f\u500d\u6570 |\n| min_gpu_memory_gb | int | \u9700\u8981\u7684\u6700\u5c0fGPU\u5185\u5b58 |\n| min_gpu_utilization | int | \u9700\u8981\u7684\u6700\u5c0fGPU\u4f7f\u7528\u7387 |\n\n#### 3.\u64a4\u9500\u4efb\u52a1\n\n\u4ec5\u9650`pending`\u72b6\u6001\u4efb\u52a1\uff0c\u5df2\u5f00\u59cb\u4efb\u52a1\u65e0\u6cd5\u64a4\u9500\n\n```python\nbool = scheduler.cancel_task(task_id)\n```\n\n#### 4.\u83b7\u53d6\u961f\u5217\u7edf\u8ba1\n\n```python\nstats = scheduler.get_queue_statistics()\n```\n\n\u961f\u5217\u7edf\u8ba1\u7ed3\u6784\n\n```python\n{\n \"system_status\": {\n \"update_time\": \"2025-09-01 15:30:13\"\n },\n \"tasks\": {\n \"pending\": {\n \"total\": 34,\n \"queue\": [\n \"task_2728059290\",\n \"task_2829088805\"\n ]\n },\n \"processing\": {\n \"total\": 0,\n \"queue\": []\n },\n \"completed\": {\n \"total\": 0,\n \"queue\": []\n },\n \"failed\": {\n \"total\": 0,\n \"queue\": []\n }\n }\n}\n```\n\n\u5b57\u6bb5\u8bf4\u660e\n\n| \u5b57\u6bb5 | \u7c7b\u578b | \u8bf4\u660e |\n|----------|--------|----------------|\n| update_time | string | \u8bf7\u6c42\u65f6\u95f4 |\n| tasks | object | \u4efb\u52a1\u961f\u5217\u7edf\u8ba1 |\n| pending | object | \u7b49\u5f85\u961f\u5217 |\n| processing | object | \u5904\u7406\u4e2d\u961f\u5217 |\n| completed | object | \u5df2\u5b8c\u6210\u961f\u5217 |\n| failed | object | \u5931\u8d25\u961f\u5217 |\n| total | int | \u4efb\u52a1\u961f\u5217\u603b\u6570 | \n| queue | list | \u4efb\u52a1\u961f\u5217\u8be6\u60c5\u5217\u8868 |\n\n\n### 5.\u66f4\u4efb\u52a1\u72b6\u6001\n\n```python\n# \u6807\u8bb0\u4efb\u52a1\u5b8c\u6210\nbool = scheduler.mark_task_completed(task_id, \"\u6267\u884c\u7ed3\u679c\")\n\n# \u6807\u8bb0\u4efb\u52a1\u5931\u8d25\nbool = scheduler.mark_task_failed(task_id, \"\u5931\u8d25\u539f\u56e0\")\n\n# \u6807\u8bb0\u4efb\u52a1\u5904\u7406\u4e2d\nbool = scheduler.mark_task_processing(task_id)\n```\n\n### 6.\u66f4\u65b0\u4efb\u52a1\u8fdb\u5ea6\n\n```python\n# \u66f4\u65b0\u4efb\u52a1\u8fdb\u5ea6\nbool = scheduler.update_task_progress(task_id, 75) # 75%\n```\n\n### 7.\u8c03\u5ea6\u5668\u63a7\u5236\n\n\u5982\u679c\u4e0d\u6267\u884c`scheduler.start()`\u5219\u4e0d\u4f1a\u542f\u52a8\u8c03\u5ea6\u5668\uff0c\u53ea\u63d0\u4f9b\u57fa\u7840\u7684Task API\u64cd\u4f5c\u529f\u80fd\n\n```python\n# \u542f\u52a8\u8c03\u5ea6\u5668\nscheduler.start()\n\n# \u5173\u95ed\u8c03\u5ea6\u5668\nscheduler.shutdown()\n```\n\n### 8.\u5904\u7406\u5668\u7ba1\u7406\n\n- **\u4efb\u52a1\u5904\u7406\u5668** (`set_custom_task_handler`): \u53ef\u9009\u8bbe\u7f6e\uff0c\u5904\u7406\u6b63\u5e38\u7684\u4e1a\u52a1\u903b\u8f91\n- **\u5f02\u5e38\u5904\u7406\u5668** (`set_custom_task_exception_handler`): \u53ef\u9009\u8bbe\u7f6e\uff0c\u5904\u7406\u4efb\u52a1\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u5f02\u5e38\u60c5\u51b5\n\n```python\n# \u6ce8\u518c\u4efb\u52a1\u5904\u7406\u5668\uff08\u53ef\u9009\uff09\nscheduler.set_custom_task_handler(task_handler)\n\n# \u6ce8\u518c\u5f02\u5e38\u5904\u7406\u5668\uff08\u53ef\u9009\uff09\nscheduler.set_custom_task_exception_handler(exception_handler)\n```\n\n**\u5904\u7406\u5668\u51fd\u6570\u7b7e\u540d**\n\n```python\n\nfrom backoff.scheduler.backoff_scheduler import (\n TaskEntity,\n ResultEntity,\n)\ndef task_handler(task: TaskEntity) -> ResultEntity:\n # \u60a8\u7684\u4e1a\u52a1\u903b\u8f91\n pass\n\ndef exception_handler(task: TaskEntity) -> ResultEntity:\n # \u5f02\u5e38\u5904\u7406\u903b\u8f91\n pass\n```\n\n#### \u8fd4\u56de\u503c\u793a\u4f8b\n\n**\u6210\u529f\u5904\u7406:**\n\n```python\nreturn ResultEntity.ok(\n result={\"status\": \"success\", \"data\": \"\u5904\u7406\u7ed3\u679c\"},\n task_id=task.task_id,\n)\n```\n\n**\u5931\u8d25\u5904\u7406:**\n```python\nreturn ResultEntity.fail(\n code=-1,\n message=\"\u4efb\u52a1\u6267\u884c\u5931\u8d25\",\n result={\"error\": \"\u5177\u4f53\u9519\u8bef\u4fe1\u606f\"},\n task_id=task.task_id,\n)\n```\n\n\n## \u2699\ufe0f \u914d\u7f6e\u8be6\u89e3\n\n### StorageConfig (\u5b58\u50a8\u914d\u7f6e)\n\n| \u53c2\u6570 | \u7c7b\u578b | \u5fc5\u586b | \u9ed8\u8ba4\u503c | \u8bf4\u660e |\n|----------|--------|------|-----------|----------------|\n| type | string | \u662f | redis | \u5b58\u50a8\u7c7b\u578b\uff0c\u76ee\u524d\u4ec5\u652f\u6301Redis |\n| host | string | \u662f | - | Redis\u4e3b\u673a\u5730\u5740 |\n| port | int | \u662f | 6379 | Redis\u7aef\u53e3 |\n| database | int | \u5426 | 0 | Redis\u6570\u636e\u5e93 |\n| password | string | \u5426 | \"\" | Redis\u5bc6\u7801 |\n\n### TaskConfig (\u4efb\u52a1\u914d\u7f6e)\n\n| \u53c2\u6570 | \u7c7b\u578b | \u5fc5\u586b | \u9ed8\u8ba4\u503c | \u8bf4\u660e |\n|---------------------|--------|------|---------------|-------------------------|\n| biz_prefix | string | \u662f | - | \u4e1a\u52a1\u524d\u7f00 |\n| max_retry_count | int | \u5426 | 3 | \u6700\u5927\u91cd\u8bd5\u6b21\u6570 |\n| backoff_strategy | string | \u5426 | exponential | \u9000\u907f\u7b56\u7565 |\n| backoff_interval | int | \u5426 | 30 | \u521d\u59cb\u9000\u907f\u95f4\u9694(\u79d2) |\n| backoff_multiplier | float | \u5426 | 2.0 | \u9000\u907f\u500d\u6570 |\n| batch_size | int | \u5426 | 100 | \u6279\u6b21\u5927\u5c0f |\n| min_gpu_memory_gb | float | \u5426 | 0 | \u6700\u5c0fGPU\u5185\u5b58(GB) |\n| min_gpu_utilization | int | \u5426 | 0 | \u6700\u5c0fGPU\u5229\u7528\u7387(%) |\n\n**\u9000\u907f\u7b56\u7565\u8bf4\u660e:**\n- `fixed`: \u56fa\u5b9a\u95f4\u9694\u91cd\u8bd5\n- `exponential`: \u6307\u6570\u9000\u907f (\u9ed8\u8ba4)\n- `linear`: \u7ebf\u6027\u9000\u907f\n\n### ThreadPoolConfig (\u7ebf\u7a0b\u6c60\u914d\u7f6e)\n\n| \u53c2\u6570 | \u7c7b\u578b | \u5fc5\u586b | \u9ed8\u8ba4\u503c | \u8bf4\u660e |\n|---------------|--------|------|--------|-------------------------|\n| concurrency | int | \u5426 | 10 | \u5e76\u53d1\u7ebf\u7a0b/\u8fdb\u7a0b\u6570 |\n| proc_mode | string | \u5426 | thread | \u6267\u884c\u6a21\u5f0f |\n| exec_timeout | int | \u5426 | 300 | \u4efb\u52a1\u8d85\u65f6\u65f6\u95f4(\u79d2) |\n\n**\u6267\u884c\u6a21\u5f0f\u8bf4\u660e:**\n- `thread`: \u7ebf\u7a0b\u6c60\u6a21\u5f0f (\u9002\u5408IO\u5bc6\u96c6\u578b\u4efb\u52a1)\n- `process`: \u8fdb\u7a0b\u6c60\u6a21\u5f0f (\u9002\u5408CPU\u5bc6\u96c6\u578b\u4efb\u52a1\uff0c\u9ed8\u8ba4)\n\n### SchedulerConfig (\u8c03\u5ea6\u5668\u914d\u7f6e)\n\n| \u53c2\u6570 | \u7c7b\u578b | \u5fc5\u586b | \u9ed8\u8ba4\u503c | \u8bf4\u660e |\n|----------|------|------|--------|----------------|\n| interval | int | \u5426 | 10 | \u8f6e\u8be2\u95f4\u9694(\u79d2) |\n\n\n\n\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "\u57fa\u4e8eRedis\u7684\u4efb\u52a1\u9000\u907f\u91cd\u8bd5\u6846\u67b6\uff0c\u652f\u6301\u591a\u79cd\u9000\u907f\u7b56\u7565",
"version": "1.1.11",
"project_urls": {
"Bug Reports": "https://github.com/yourusername/task-backoff-scheduler/issues",
"Documentation": "https://github.com/yourusername/task-backoff-scheduler#readme",
"Homepage": "https://github.com/xiaofucoding/maas-backoff-scheduler.git/",
"Source": "https://github.com/yourusername/task-backoff-scheduler"
},
"split_keywords": [
"task",
"retry",
"backoff",
"redis",
"queue"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "3495337476c4e2e34e95790090ddbe19374cbb22bdb4e3a8cb01605165747c58",
"md5": "74d6bb8d5e1caccf6868bdad22a7d003",
"sha256": "b92d1b36ffa6bb9bd88a61499c1a5fa63cba1e6987c7a46562823a333d3a3c00"
},
"downloads": -1,
"filename": "maas_backoff_scheduler-1.1.11-py2-none-any.whl",
"has_sig": false,
"md5_digest": "74d6bb8d5e1caccf6868bdad22a7d003",
"packagetype": "bdist_wheel",
"python_version": "py2",
"requires_python": ">=3.7",
"size": 38910,
"upload_time": "2025-09-01T08:45:03",
"upload_time_iso_8601": "2025-09-01T08:45:03.971815Z",
"url": "https://files.pythonhosted.org/packages/34/95/337476c4e2e34e95790090ddbe19374cbb22bdb4e3a8cb01605165747c58/maas_backoff_scheduler-1.1.11-py2-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "775c45cdda6a9d41a07a8babd75f41816ae52166d0d52fe230b55a9116a295cb",
"md5": "ff6b66d4dd228c96c4b6c4d89e9aabaf",
"sha256": "26625e8777f1ee9b32b98af0e5bc3bc24f19e53dbb90c6a6212e1e8c6c2cbc98"
},
"downloads": -1,
"filename": "maas-backoff-scheduler-1.1.11.tar.gz",
"has_sig": false,
"md5_digest": "ff6b66d4dd228c96c4b6c4d89e9aabaf",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 26843,
"upload_time": "2025-09-01T08:45:05",
"upload_time_iso_8601": "2025-09-01T08:45:05.718911Z",
"url": "https://files.pythonhosted.org/packages/77/5c/45cdda6a9d41a07a8babd75f41816ae52166d0d52fe230b55a9116a295cb/maas-backoff-scheduler-1.1.11.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-01 08:45:05",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "xiaofucoding",
"github_project": "maas-backoff-scheduler",
"github_not_found": true,
"lcname": "maas-backoff-scheduler"
}