File size: 4,038 Bytes
3e35e18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import sys,asyncio
#from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.schedulers.asyncio import AsyncIOScheduler  # 替换为异步调度器
from app.utils.logging import log
from app.utils.stats import clean_expired_stats
from app.config import api_call_stats
from app.utils import check_version
from zoneinfo import ZoneInfo
from app.config import settings
def handle_exception(exc_type, exc_value, exc_traceback):
    """
    全局异常处理函数
    
    处理未捕获的异常,并记录到日志中
    """
    if issubclass(exc_type, KeyboardInterrupt):
        sys.excepthook(exc_type, exc_value, exc_traceback)
        return
    from app.utils.error_handling import translate_error
    error_message = translate_error(str(exc_value))
    log('error', f"未捕获的异常: {error_message}", status_code=500, error_message=error_message)
'''
def schedule_cache_cleanup(response_cache_manager, active_requests_manager):
    """
    设置定期清理缓存和活跃请求的定时任务
    顺便定时检查更新
    Args:
        response_cache_manager: 响应缓存管理器实例
        active_requests_manager: 活跃请求管理器实例
    """
    scheduler = BackgroundScheduler()
    scheduler.add_job(response_cache_manager.clean_expired, 'interval', minutes=1)  # 每分钟清理过期缓存
    scheduler.add_job(active_requests_manager.clean_completed, 'interval', seconds=30)  # 每30秒清理已完成的活跃请求
    scheduler.add_job(active_requests_manager.clean_long_running, 'interval', minutes=5, args=[300])  # 每5分钟清理运行超过5分钟的任务
    scheduler.add_job(clean_expired_stats, 'interval', minutes=5,args=[api_call_stats])  # 每5分钟清理过期的统计数据
    scheduler.add_job(check_version, 'interval', minutes=1)  # 每4小时检查更新
    scheduler.start()
    
    return scheduler

'''
def schedule_cache_cleanup(response_cache_manager, active_requests_manager):
    """
    设置定期清理缓存和活跃请求的定时任务
    顺便定时检查更新
    Args:
        response_cache_manager: 响应缓存管理器实例
        active_requests_manager: 活跃请求管理器实例
    """
    beijing_tz = ZoneInfo("Asia/Shanghai")
    scheduler = AsyncIOScheduler(timezone=beijing_tz)  # 使用 AsyncIOScheduler 替代 BackgroundScheduler
    
    # 添加任务时直接传递异步函数(无需额外包装)
    scheduler.add_job(response_cache_manager.clean_expired, 'interval', minutes=1)
    scheduler.add_job(active_requests_manager.clean_completed, 'interval', seconds=30)
    scheduler.add_job(active_requests_manager.clean_long_running, 'interval', minutes=5, args=[300])
    scheduler.add_job(clean_expired_stats, 'interval', minutes=5, args=[api_call_stats])
    scheduler.add_job(check_version, 'interval', hours=4)
    scheduler.add_job(api_call_stats_clean, 'cron', hour=16,minute=0)  # 每天16:00清理统计数据
    scheduler.start()
    return scheduler

async def api_call_stats_clean():
    """
    每天定时重置API调用统计数据
    
    将settings.api_call_stats重置为初始空结构
    """
    from app.utils.logging import log
    
    # 清空原字典中的数据,而不是重新赋值
    settings.api_call_stats['last_24h']['total'].clear()
    settings.api_call_stats['last_24h']['by_endpoint'].clear()
    settings.api_call_stats['hourly']['total'].clear()
    settings.api_call_stats['hourly']['by_endpoint'].clear()
    settings.api_call_stats['minute']['total'].clear()
    settings.api_call_stats['minute']['by_endpoint'].clear()
    
    # 重新初始化结构
    settings.api_call_stats = {
        'last_24h': {
            'total': {},
            'by_endpoint': {}
        },
        'hourly': {
            'total': {},
            'by_endpoint': {}
        },
        'minute': {
            'total': {},
            'by_endpoint': {}
        }
    }
    
    # 记录日志,确认函数被执行
    log('info', "API调用统计数据已重置")