"""Celery Beat periodic tasks.""" from __future__ import annotations import json import logging from celery import shared_task logger = logging.getLogger(__name__) @shared_task(name="app.tasks.beat_tasks.broadcast_queue_status", queue="step_processing") def broadcast_queue_status() -> None: """Broadcast current queue depths to all WebSocket clients every 10s. Publishes to the Redis '__broadcast__' channel which the WebSocket subscriber in the FastAPI process forwards to all connected clients. """ try: import redis as sync_redis from app.config import settings r = sync_redis.from_url(settings.redis_url, decode_responses=True) depths = { "step_processing": r.llen("step_processing"), "thumbnail_rendering": r.llen("thumbnail_rendering"), } event = {"type": "queue_update", "depths": depths} r.publish("__broadcast__", json.dumps(event)) r.close() logger.debug("Broadcast queue_update: %s", depths) except Exception as exc: logger.warning("broadcast_queue_status failed: %s", exc)