Worker¶
Il worker elabora la coda job in modo sequenziale (FIFO).
Avvio automatico (UI)¶
server.py (lifespan + _ensure_worker()) → start_background_worker():
- Un solo worker per volta (controllo
worker.pid) - Processo daemon separato da uvicorn/FastAPI
warmup_asr()nel worker prima del loop (import NeMo nel main thread del worker)
Avvio manuale¶
Utile per:
- Docker (un container = UI + worker subprocess, oppure solo
worker) - Debug headless
- Separare UI e elaborazione su macchine diverse (stesso
queue.dbsu NFS — non ancora documentato/testato)
Loop¶
while True:
job = claim_next_job() # atomico SQLite
if job is None:
sleep(poll_interval)
continue
run_pipeline(job.id)
Recupero crash e sync disco¶
All'avvio worker:
recover_orphaned_running_jobs()— rimette inqueuedi job lasciati inrunningreconcile_jobs_with_disk()— allineaqueue.dbcon le cartelle su disco
La UI esegue lo stesso reconcile nel proprio lifespan e all'apertura di / e /jobs.
File PID¶
data/output/jobs/worker.pid — PID del processo worker attivo.
scripts/restart_ui.py termina anche i worker e rimuove il PID file.
Docker¶
Nell'immagine Docker, sbobina docker-ui avvia UI + worker subprocess. I modelli ASR sono in /models/ nell'immagine.
Per deploy solo worker (senza UI):
Non fare¶
- Non avviare più worker sullo stesso
queue.db(race su claim — mitigato da SQLite ma sconsigliato) - Non usare thread in-process per NeMo dentro il server web