mirror of
https://github.com/jamiepine/voicebox.git
synced 2026-09-15 12:50:42 -07:00
- Add backend/STYLE_GUIDE.md covering formatting, imports, types, docstrings, comments, error handling, async, logging, and naming conventions - Add pyproject.toml with ruff linter/formatter config (ERA, FIX, isort, pyupgrade) - Extract generation service (Phase 3): unified run_generation() replaces three duplicated closures, serial queue moved to services/task_queue.py - Delete Makefile in favor of justfile; update all references - Add Python lint/format/test commands to justfile (check-python, fix-python, test) - Install ruff, pytest, pytest-asyncio as dev tools in setup-python - Update REFACTOR_PLAN.md with Phase 3 and Phase 7 completion
49 lines
1.4 KiB
Python
49 lines
1.4 KiB
Python
"""
|
|
Serial generation queue — ensures only one TTS inference runs at a time
|
|
to avoid GPU contention.
|
|
"""
|
|
|
|
import asyncio
|
|
import traceback
|
|
|
|
# Keep references to fire-and-forget background tasks to prevent GC
|
|
_background_tasks: set = set()
|
|
|
|
# Generation queue — serializes TTS inference to avoid GPU contention
|
|
_generation_queue: asyncio.Queue = None # type: ignore # initialized at startup
|
|
|
|
|
|
def create_background_task(coro) -> asyncio.Task:
|
|
"""Create a background task and prevent it from being garbage collected."""
|
|
task = asyncio.create_task(coro)
|
|
_background_tasks.add(task)
|
|
task.add_done_callback(_background_tasks.discard)
|
|
return task
|
|
|
|
|
|
async def _generation_worker():
|
|
"""Worker that processes generation tasks one at a time."""
|
|
while True:
|
|
coro = await _generation_queue.get()
|
|
try:
|
|
await coro
|
|
except Exception:
|
|
traceback.print_exc()
|
|
finally:
|
|
_generation_queue.task_done()
|
|
|
|
|
|
def enqueue_generation(coro):
|
|
"""Add a generation coroutine to the serial queue."""
|
|
_generation_queue.put_nowait(coro)
|
|
|
|
|
|
def init_queue():
|
|
"""Initialize the generation queue and start the worker.
|
|
|
|
Must be called once during application startup (inside a running event loop).
|
|
"""
|
|
global _generation_queue
|
|
_generation_queue = asyncio.Queue()
|
|
create_background_task(_generation_worker())
|