Files
g0v0-server/app/service/stats_scheduler.py
2025-08-22 03:16:21 +08:00

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()