| from __future__ import annotations |
|
|
| import asyncio |
| import logging |
| from typing import Any, Awaitable, Callable |
|
|
| from src.workers.job_queue import AudioJob, JobQueue |
|
|
| logger = logging.getLogger("nexus.worker") |
|
|
|
|
| class WorkerManager: |
| def __init__( |
| self, |
| queue: JobQueue, |
| process_audio_job: Callable[[str, str, str, Any, Any, Any], Awaitable[None]], |
| transcriber_factory: Callable[[], Any], |
| diarize_fn: Any, |
| analyze_fn: Any, |
| ) -> None: |
| self.queue = queue |
| self.process_audio_job = process_audio_job |
| self.transcriber_factory = transcriber_factory |
| self.diarize_fn = diarize_fn |
| self.analyze_fn = analyze_fn |
|
|
| async def run_forever(self) -> None: |
| logger.info("worker manager started") |
| while True: |
| job: AudioJob = await self.queue.dequeue() |
| try: |
| await self.process_audio_job( |
| job.job_id, |
| job.storage_path, |
| job.filename, |
| self.transcriber_factory, |
| self.diarize_fn, |
| self.analyze_fn, |
| ) |
| except Exception: |
| logger.exception("worker manager failed job", extra={"job_id": job.job_id}) |
| finally: |
| self.queue.task_done() |
|
|
| def start_background_task(self) -> asyncio.Task[None]: |
| return asyncio.create_task(self.run_forever()) |
|
|