添加任务自动重试机制

- 任务执行失败(非登录失败)时自动重试,最多重试2次
- 重试间隔5秒,给前端显示状态"等待重试"
- 添加sys模块导入修复

🤖 Generated with Claude Code
This commit is contained in:
Yu Yon
2025-12-12 13:45:34 +08:00
parent 82f8a8e73d
commit 4a47d4ba6b

34
app.py
View File

@@ -23,6 +23,7 @@ import threading
import time import time
import json import json
import os import os
import sys
import secrets # 安全修复: 使用加密安全的随机数生成 import secrets # 安全修复: 使用加密安全的随机数生成
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from functools import wraps from functools import wraps
@@ -1942,9 +1943,14 @@ def get_user_semaphore(user_id):
return user_semaphores[user_id] return user_semaphores[user_id]
def run_task(user_id, account_id, browse_type, enable_screenshot=True, source="manual"): def run_task(user_id, account_id, browse_type, enable_screenshot=True, source="manual", retry_count=0):
"""运行自动化任务""" """运行自动化任务
print(f"[DEBUG run_task] account={account_id}, enable_screenshot={enable_screenshot} (类型:{type(enable_screenshot).__name__}), source={source}")
Args:
retry_count: 当前重试次数用于自动重试机制最多重试2次
"""
MAX_AUTO_RETRY = 2 # 最大自动重试次数
print(f"[DEBUG run_task] account={account_id}, enable_screenshot={enable_screenshot} (类型:{type(enable_screenshot).__name__}), source={source}, retry={retry_count}")
if user_id not in user_accounts or account_id not in user_accounts[user_id]: if user_id not in user_accounts or account_id not in user_accounts[user_id]:
return return
@@ -2399,10 +2405,30 @@ def run_task(user_id, account_id, browse_type, enable_screenshot=True, source="m
socketio.emit('account_update', account.to_dict(), room=f'user_{user_id}') socketio.emit('account_update', account.to_dict(), room=f'user_{user_id}')
log_to_client(f"截图功能已禁用,跳过截图", user_id, account_id) log_to_client(f"截图功能已禁用,跳过截图", user_id, account_id)
else: else:
# 任务非正常完成,重置状态为未开始 # 任务非正常完成
if account.status not in ["登录失败", "出错"]: if account.status not in ["登录失败", "出错"]:
account.status = "未开始" account.status = "未开始"
socketio.emit('account_update', account.to_dict(), room=f'user_{user_id}') socketio.emit('account_update', account.to_dict(), room=f'user_{user_id}')
# 自动重试机制:非登录失败的情况下,自动重试
elif account.status == "出错" and retry_count < MAX_AUTO_RETRY:
# 延迟5秒后重新加入队列
log_to_client(f"⚠ 任务执行失败5秒后自动重试 ({retry_count + 1}/{MAX_AUTO_RETRY})...", user_id, account_id)
account.status = "等待重试"
socketio.emit('account_update', account.to_dict(), room=f'user_{user_id}')
def delayed_retry():
time.sleep(5)
if not account.should_stop:
log_to_client(f"🔄 开始第 {retry_count + 1} 次自动重试...", user_id, account_id)
thread = threading.Thread(
target=run_task,
args=(user_id, account_id, browse_type, enable_screenshot, source, retry_count + 1),
daemon=True
)
thread.start()
active_tasks[account_id] = thread
threading.Thread(target=delayed_retry, daemon=True).start()
finally: finally:
# 释放用户级信号量 # 释放用户级信号量