maas-backoff-scheduler


Namemaas-backoff-scheduler JSON
Version 1.1.11 PyPI version JSON
download
home_pagehttps://github.com/xiaofucoding/maas-backoff-scheduler.git/
Summary基于Redis的任务退避重试框架,支持多种退避策略
upload_time2025-09-01 08:45:05
maintainerNone
docs_urlNone
authorxinzf
requires_python>=3.7
licenseMIT
keywords task retry backoff redis queue
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # MaaS 任务退避重试框架

[![Python](https://img.shields.io/badge/Python-3-blue.svg)](https://www.python.org/)
[![License](https://img.shields.io/badge/License-MIT-green.svg)](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[![Python](https://img.shields.io/badge/Python-3-blue.svg)](https://www.python.org/)\n[![License](https://img.shields.io/badge/License-MIT-green.svg)](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"
}
        
Elapsed time: 1.12283s