ThreadHouse / app /live_tracking.py
paudelapil's picture
Project do-over
65fa0c5
Raw
History Blame Contribute Delete
754 Bytes
import asyncio
from typing import Any, Optional
# Set of subscriber queues. Each WebSocket holds one.
_subscribers: set[asyncio.Queue] = set()
def subscribe() -> asyncio.Queue:
q: asyncio.Queue = asyncio.Queue(maxsize=200)
_subscribers.add(q)
return q
def unsubscribe(q: asyncio.Queue) -> None:
_subscribers.discard(q)
async def publish(event: dict[str, Any]) -> None:
"""Fan-out to every subscriber. Drops the event for slow consumers."""
dead: list[asyncio.Queue] = []
for q in list(_subscribers):
try:
q.put_nowait(event)
except asyncio.QueueFull:
dead.append(q)
for q in dead:
_subscribers.discard(q)
def subscriber_count() -> int:
return len(_subscribers)