Files
fquiz/api/app/core/worker_signals.py
T

71 lines
1.9 KiB
Python

from __future__ import annotations
from celery import signals
from ..services.worker_registry_service import mark_worker_offline, register_worker
def _normalize_worker_name(sender: object | None) -> str:
if sender is None:
return ""
text = str(sender).strip()
return text
def _extract_queue_names(sender: object | None) -> list[str]:
consumer = getattr(sender, "consumer", None)
if consumer is None:
return []
queues = getattr(consumer, "queues", None)
if queues is None:
return []
names: list[str] = []
try:
iterator = list(queues)
except TypeError:
iterator = []
for item in iterator:
name = getattr(item, "name", None)
if name is None:
continue
value = str(name).strip()
if value:
names.append(value)
return names
@signals.worker_ready.connect
def on_worker_ready(sender=None, **kwargs): # type: ignore[no-untyped-def]
worker_name = _normalize_worker_name(sender)
if not worker_name:
return
queues = _extract_queue_names(sender)
register_worker(
worker_name=worker_name,
status="online",
queues=queues,
heartbeat_increment=False,
metadata={"event": "worker_ready"},
)
@signals.heartbeat_sent.connect
def on_worker_heartbeat(sender=None, **kwargs): # type: ignore[no-untyped-def]
worker_name = _normalize_worker_name(sender)
if not worker_name:
return
register_worker(
worker_name=worker_name,
status="online",
heartbeat_increment=True,
metadata={"event": "heartbeat_sent"},
)
@signals.worker_shutdown.connect
def on_worker_shutdown(sender=None, **kwargs): # type: ignore[no-untyped-def]
worker_name = _normalize_worker_name(sender)
if not worker_name:
return
mark_worker_offline(worker_name)