34 lines
1.1 KiB
Python
34 lines
1.1 KiB
Python
from __future__ import annotations
|
|
|
|
import asyncio
|
|
import logging
|
|
|
|
from backend.features.screener.service import ScreenerError, ScreenerService
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
async def run_screener_scheduler(service: ScreenerService, stop: asyncio.Event) -> None:
|
|
while not stop.is_set():
|
|
try:
|
|
result = await asyncio.to_thread(service.run_after_close)
|
|
if result:
|
|
logger.info(
|
|
"Screener after-close run completed",
|
|
extra={"event": "screener.completed", "context": result},
|
|
)
|
|
except ScreenerError as exc:
|
|
logger.info(
|
|
"Screener is waiting for complete market data",
|
|
extra={"event": "screener.waiting", "context": {"reason": str(exc)}},
|
|
)
|
|
except Exception:
|
|
logger.exception(
|
|
"Screener scheduler failed",
|
|
extra={"event": "screener.failed"},
|
|
)
|
|
try:
|
|
await asyncio.wait_for(stop.wait(), timeout=300)
|
|
except TimeoutError:
|
|
pass
|