79 lines
2.2 KiB
Python
79 lines
2.2 KiB
Python
from __future__ import annotations
|
|
|
|
import asyncio
|
|
from datetime import datetime
|
|
|
|
from app.log import logger
|
|
from app.router.v2.stats import record_hourly_stats, update_registered_users_count
|
|
|
|
|
|
class StatsScheduler:
|
|
"""统计数据调度器"""
|
|
|
|
def __init__(self):
|
|
self._running = False
|
|
self._stats_task: asyncio.Task | None = None
|
|
self._registered_task: asyncio.Task | None = None
|
|
|
|
def start(self) -> None:
|
|
"""启动调度器"""
|
|
if self._running:
|
|
return
|
|
|
|
self._running = True
|
|
self._stats_task = asyncio.create_task(self._stats_loop())
|
|
self._registered_task = asyncio.create_task(self._registered_users_loop())
|
|
logger.info("Stats scheduler started")
|
|
|
|
def stop(self) -> None:
|
|
"""停止调度器"""
|
|
if not self._running:
|
|
return
|
|
|
|
self._running = False
|
|
|
|
if self._stats_task:
|
|
self._stats_task.cancel()
|
|
if self._registered_task:
|
|
self._registered_task.cancel()
|
|
|
|
logger.info("Stats scheduler stopped")
|
|
|
|
async def _stats_loop(self) -> None:
|
|
"""统计数据记录循环 - 每30分钟记录一次"""
|
|
while self._running:
|
|
try:
|
|
await record_hourly_stats()
|
|
logger.debug("Recorded hourly statistics")
|
|
except Exception as e:
|
|
logger.error(f"Error in stats loop: {e}")
|
|
|
|
# 等待30分钟
|
|
await asyncio.sleep(30 * 60)
|
|
|
|
async def _registered_users_loop(self) -> None:
|
|
"""注册用户数更新循环 - 每5分钟更新一次"""
|
|
while self._running:
|
|
try:
|
|
await update_registered_users_count()
|
|
logger.debug("Updated registered users count")
|
|
except Exception as e:
|
|
logger.error(f"Error in registered users loop: {e}")
|
|
|
|
# 等待5分钟
|
|
await asyncio.sleep(5 * 60)
|
|
|
|
|
|
# 全局调度器实例
|
|
stats_scheduler = StatsScheduler()
|
|
|
|
|
|
def start_stats_scheduler() -> None:
|
|
"""启动统计调度器"""
|
|
stats_scheduler.start()
|
|
|
|
|
|
def stop_stats_scheduler() -> None:
|
|
"""停止统计调度器"""
|
|
stats_scheduler.stop()
|