44 lines
1.3 KiB
Python
44 lines
1.3 KiB
Python
import asyncio
|
|
import logging
|
|
|
|
from app.config import settings
|
|
from app.services.dashboard_monitor import run_dashboard_monitor_cycle
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
_stop_event: asyncio.Event | None = None
|
|
_worker_task: asyncio.Task | None = None
|
|
|
|
|
|
async def _loop() -> None:
|
|
assert _stop_event is not None
|
|
while not _stop_event.is_set():
|
|
try:
|
|
await run_dashboard_monitor_cycle(run_type="auto", scope=None, force=False)
|
|
except Exception as exc:
|
|
logger.error("[dashboard_monitor] Cycle error: %s", exc, exc_info=True)
|
|
|
|
try:
|
|
await asyncio.wait_for(_stop_event.wait(), timeout=settings.DASHBOARD_MONITOR_TICK_SECONDS)
|
|
except asyncio.TimeoutError:
|
|
pass
|
|
|
|
|
|
def start_dashboard_monitor() -> None:
|
|
global _stop_event, _worker_task
|
|
_stop_event = asyncio.Event()
|
|
_worker_task = asyncio.create_task(_loop())
|
|
logger.info("[dashboard_monitor] Worker started (tick=%ds)", settings.DASHBOARD_MONITOR_TICK_SECONDS)
|
|
|
|
|
|
async def stop_dashboard_monitor() -> None:
|
|
global _stop_event, _worker_task
|
|
if _stop_event:
|
|
_stop_event.set()
|
|
if _worker_task:
|
|
_worker_task.cancel()
|
|
try:
|
|
await _worker_task
|
|
except asyncio.CancelledError:
|
|
pass
|
|
logger.info("[dashboard_monitor] Worker stopped")
|