"""Абстракция очереди задач. Сегодня — обёртка над asyncio.Queue. Завтра можно подменить на Redis/RabbitMQ, не трогая вызовы в сервисах: интерфейс DownloadQueue остаётся прежним. """ from __future__ import annotations import asyncio class DownloadQueue: """Очередь идентификаторов загрузок, ожидающих обработки воркерами.""" def __init__(self) -> None: self._queue: asyncio.Queue[str] = asyncio.Queue() async def add(self, download_id: str) -> None: await self._queue.put(download_id) async def get(self) -> str: return await self._queue.get() def task_done(self) -> None: self._queue.task_done() async def join(self) -> None: await self._queue.join() def qsize(self) -> int: return self._queue.qsize()