28 lines
838 B
Python
28 lines
838 B
Python
"""Periodic reconcile loop for cross-process board consistency."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import asyncio
|
|
from collections.abc import Awaitable, Callable
|
|
|
|
|
|
class ReconcileLoop:
|
|
"""Run a callback periodically until stopped."""
|
|
|
|
def __init__(self, interval_seconds: float, callback: Callable[[], Awaitable[None]]) -> None:
|
|
self.interval_seconds = max(0.5, float(interval_seconds))
|
|
self._callback = callback
|
|
self._stop_event = asyncio.Event()
|
|
|
|
async def run(self) -> None:
|
|
while not self._stop_event.is_set():
|
|
await self._callback()
|
|
try:
|
|
await asyncio.wait_for(self._stop_event.wait(), timeout=self.interval_seconds)
|
|
except asyncio.TimeoutError:
|
|
continue
|
|
|
|
def stop(self) -> None:
|
|
self._stop_event.set()
|
|
|