modify: 修改重试逻辑
This commit is contained in:
+1
-1
@@ -1 +1 @@
|
|||||||
3.13
|
3.11
|
||||||
|
|||||||
+14
-6
@@ -13,7 +13,7 @@ classifiers = [
|
|||||||
"Operating System :: POSIX :: Linux",
|
"Operating System :: POSIX :: Linux",
|
||||||
]
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"queue_sqlite_core>=0.2.0",
|
"queue-sqlite-core>=0.2.0",
|
||||||
]
|
]
|
||||||
description = "A high-performance, SQLite-based distributed task queue system with Rust-backed core operations. Supports task mounting, message listening, priority handling, retry mechanisms, and automatic cleanup of expired messages. Ideal for building reliable, scalable background task processing systems."
|
description = "A high-performance, SQLite-based distributed task queue system with Rust-backed core operations. Supports task mounting, message listening, priority handling, retry mechanisms, and automatic cleanup of expired messages. Ideal for building reliable, scalable background task processing systems."
|
||||||
name = "queue-sqlite"
|
name = "queue-sqlite"
|
||||||
@@ -22,13 +22,13 @@ requires-python = ">=3.11"
|
|||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
|
|
||||||
[project.optional-dependencies]
|
[project.optional-dependencies]
|
||||||
pyside6 = ["qtpy", "PySide6"]
|
|
||||||
pyqt6 = ["qtpy", "PyQt6"]
|
|
||||||
pyqt5 = ["qtpy", "PyQt5"]
|
pyqt5 = ["qtpy", "PyQt5"]
|
||||||
|
pyqt6 = ["qtpy", "PyQt6"]
|
||||||
|
pyside6 = ["qtpy", "PySide6"]
|
||||||
|
|
||||||
[[tool.uv.index]]
|
# [[tool.uv.index]]
|
||||||
default = true
|
# default = true
|
||||||
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
|
# url = "https://pypi.tuna.tsinghua.edu.cn/simple"
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
build-backend = "hatchling.build"
|
build-backend = "hatchling.build"
|
||||||
@@ -44,3 +44,11 @@ dev = [
|
|||||||
|
|
||||||
[tool.hatch.build.targets.wheel]
|
[tool.hatch.build.targets.wheel]
|
||||||
packages = ["src/queue_sqlite"]
|
packages = ["src/queue_sqlite"]
|
||||||
|
|
||||||
|
[tool.uv.workspace]
|
||||||
|
members = [
|
||||||
|
"src/queue_sqlite_core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[tool.uv.sources]
|
||||||
|
queue-sqlite-core = { workspace = true }
|
||||||
|
|||||||
@@ -11,12 +11,13 @@
|
|||||||
|
|
||||||
from ..model import MessageItem
|
from ..model import MessageItem
|
||||||
from ..constant import MessageStatus
|
from ..constant import MessageStatus
|
||||||
|
from ..mounter.task_mounter import TaskMeta
|
||||||
import json
|
import json
|
||||||
import asyncio
|
import asyncio
|
||||||
import functools
|
import functools
|
||||||
|
|
||||||
|
|
||||||
def retry_async(max_retries=3, delay=1):
|
def retry_async(max_retries=3):
|
||||||
"""
|
"""
|
||||||
异步重试装饰器
|
异步重试装饰器
|
||||||
|
|
||||||
@@ -30,8 +31,10 @@ def retry_async(max_retries=3, delay=1):
|
|||||||
async def wrapper(self, *args, **kwargs):
|
async def wrapper(self, *args, **kwargs):
|
||||||
last_exception = None
|
last_exception = None
|
||||||
# 使用message_item中的retry_count作为最大重试次数
|
# 使用message_item中的retry_count作为最大重试次数
|
||||||
retries = getattr(self.message_item, "retry_count", max_retries)
|
task_meta: TaskMeta = self.callback.meta
|
||||||
|
retries = task_meta.max_retries
|
||||||
|
# retries = getattr(self.message_item, "retry_count", max_retries)
|
||||||
|
delay_time = task_meta.delay
|
||||||
# 至少尝试一次(retries+1),最多尝试max_retries+1次
|
# 至少尝试一次(retries+1),最多尝试max_retries+1次
|
||||||
actual_retries = min(retries, max_retries) if max_retries > 0 else retries
|
actual_retries = min(retries, max_retries) if max_retries > 0 else retries
|
||||||
|
|
||||||
@@ -41,7 +44,7 @@ def retry_async(max_retries=3, delay=1):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
last_exception = e
|
last_exception = e
|
||||||
if attempt < actual_retries:
|
if attempt < actual_retries:
|
||||||
await asyncio.sleep(delay)
|
await asyncio.sleep(delay_time)
|
||||||
else:
|
else:
|
||||||
break
|
break
|
||||||
if last_exception:
|
if last_exception:
|
||||||
@@ -62,7 +65,7 @@ class AsyncTaskCycle:
|
|||||||
self.task_status = None
|
self.task_status = None
|
||||||
self.task_error = None
|
self.task_error = None
|
||||||
|
|
||||||
@retry_async(max_retries=3, delay=1)
|
@retry_async(max_retries=3)
|
||||||
async def run(self):
|
async def run(self):
|
||||||
try:
|
try:
|
||||||
task_result = await self.callback(self.message_item) # type: ignore
|
task_result = await self.callback(self.message_item) # type: ignore
|
||||||
|
|||||||
@@ -12,13 +12,14 @@
|
|||||||
from ..model import MessageItem
|
from ..model import MessageItem
|
||||||
from typing import Callable, Optional
|
from typing import Callable, Optional
|
||||||
from ..constant import MessageStatus
|
from ..constant import MessageStatus
|
||||||
|
from ..mounter.task_mounter import TaskMeta
|
||||||
import json
|
import json
|
||||||
|
|
||||||
import functools
|
import functools
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
|
||||||
def retry_sync(max_retries=3, delay=1):
|
def retry_sync(max_retries=3):
|
||||||
"""
|
"""
|
||||||
同步重试装饰器
|
同步重试装饰器
|
||||||
|
|
||||||
@@ -32,8 +33,10 @@ def retry_sync(max_retries=3, delay=1):
|
|||||||
def wrapper(self, *args, **kwargs):
|
def wrapper(self, *args, **kwargs):
|
||||||
last_exception = None
|
last_exception = None
|
||||||
# 使用message_item中的retry_count作为最大重试次数
|
# 使用message_item中的retry_count作为最大重试次数
|
||||||
retries = getattr(self.message_item, "retry_count", max_retries)
|
task_meta: TaskMeta = self.callback.meta
|
||||||
|
retries = task_meta.max_retries
|
||||||
|
# retries = getattr(self.message_item, "retry_count", max_retries)
|
||||||
|
delay_time = task_meta.delay
|
||||||
# 至少尝试一次(retries+1),最多尝试max_retries+1次
|
# 至少尝试一次(retries+1),最多尝试max_retries+1次
|
||||||
actual_retries = min(retries, max_retries) if max_retries > 0 else retries
|
actual_retries = min(retries, max_retries) if max_retries > 0 else retries
|
||||||
|
|
||||||
@@ -42,8 +45,9 @@ def retry_sync(max_retries=3, delay=1):
|
|||||||
return func(self, *args, **kwargs)
|
return func(self, *args, **kwargs)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
last_exception = e
|
last_exception = e
|
||||||
|
self.message_item.retry_count = attempt
|
||||||
if attempt < actual_retries:
|
if attempt < actual_retries:
|
||||||
time.sleep(delay)
|
time.sleep(delay_time)
|
||||||
else:
|
else:
|
||||||
break
|
break
|
||||||
|
|
||||||
@@ -66,7 +70,7 @@ class TaskCycle:
|
|||||||
self.task_status = None
|
self.task_status = None
|
||||||
self.task_error = None
|
self.task_error = None
|
||||||
|
|
||||||
@retry_sync(max_retries=3, delay=1)
|
@retry_sync(max_retries=3)
|
||||||
def run(self):
|
def run(self):
|
||||||
try:
|
try:
|
||||||
task_result = self.callback(self.message_item) # type: ignore
|
task_result = self.callback(self.message_item) # type: ignore
|
||||||
|
|||||||
@@ -10,6 +10,15 @@
|
|||||||
|
|
||||||
|
|
||||||
from typing import Callable, List
|
from typing import Callable, List
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class TaskMeta:
|
||||||
|
name: str = field(default="", metadata={"help": "任务名称"})
|
||||||
|
description: str = field(default="", metadata={"help": "任务描述"})
|
||||||
|
max_retries: int = field(default=3, metadata={"help": "任务最大重试次数"})
|
||||||
|
delay: float = field(default=1, metadata={"help": "任务延迟执行时间"})
|
||||||
|
|
||||||
|
|
||||||
class TaskMounter:
|
class TaskMounter:
|
||||||
@@ -23,7 +32,14 @@ class TaskMounter:
|
|||||||
|
|
||||||
def decorator(function: Callable):
|
def decorator(function: Callable):
|
||||||
# 使用自定义名称或函数原名
|
# 使用自定义名称或函数原名
|
||||||
function.meta = meta # type: ignore
|
name = meta.get("name", function.__name__)
|
||||||
|
description = meta.get("description", "")
|
||||||
|
max_retries = meta.get("max_retries", 3)
|
||||||
|
delay = meta.get("delay", 1)
|
||||||
|
task_meta = TaskMeta(
|
||||||
|
name=name, description=description, max_retries=max_retries, delay=delay
|
||||||
|
)
|
||||||
|
function.meta = task_meta # type: ignore
|
||||||
setattr(TaskMounter, function.__name__, function)
|
setattr(TaskMounter, function.__name__, function)
|
||||||
return function
|
return function
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ features = ["pyo3/extension-module"]
|
|||||||
|
|
||||||
[[tool.uv.index]]
|
[[tool.uv.index]]
|
||||||
default = true
|
default = true
|
||||||
url = "http://124.71.68.6:3141/root/pypi"
|
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
|
||||||
|
|
||||||
[dependency-groups]
|
[dependency-groups]
|
||||||
dev = [
|
dev = [
|
||||||
|
|||||||
Reference in New Issue
Block a user