Worker di visione: /run sincrono dentro l'event loop, senza timeout; unhealthy non viene riavviato #34
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
GRAVITÀ: media
FILE: src/vision_worker/main.py:26-42 ; Dockerfile.vision:40 ; docker-compose.yml:61-67
COSA:
async def runesegue PIL erun_graphin modo sincrono. Con--workers 2due grafi lenti bloccano tutto, /health compreso. Il backend dà 504 a 120 s ma il calcolo continua.restart: unless-stoppednon riavvia un container unhealthy.INPUT: tre tablet acquisiscono insieme con un grafo da ~30 s.
VERIFICATO: lettura di main.py:24-48: nessun
run_in_executor/threadpool/timeout.PRESUNTO: comportamento a container avviati (non avviati).
ORIGINE: revisione fable del 21/09/2026 su ramo
V3.0.0, commit8cc5e82. Documento completo:_output/2026-09-21-TieMeasureFlow-revisione.mdsu Wasabi.⚡ jeeg — preso in carico 2026-09-21T20:23:25Z
ramo:
lavoro/jeeg· capacità: docker, gpu, systemdANALISI (passo 1) — ramo
lavoro/jeeg, worktree~/lavoro/TieMeasureFlowsu jeeg, lotto C1MODIFICHE: src/vision_worker/main.py —
/runesegue decodifica +run_graphinawait asyncio.wait_for(asyncio.to_thread(...), timeout=VISION_RUN_TIMEOUT_S)(env, default 100, sotto i 120 s del backend) → 504 del worker al timeout (il backend lo traduce in 504)./healthresta async leggero, così risponde anche con calcoli in corso. Semaforoasyncio.Semaphore(VISION_MAX_CONCURRENCY default 2): oltre → 503 «worker busy» (backend → 503). Nota nel docstring: il thread scaduto non è interrompibile, continua fino a fine calcolo.TEST: run_graph finto che dorme 0.5 s con timeout 0.1 → 504 e
/healthrisponde durante l'attesa.NON TOCCARE: Dockerfile.vision, compose (lotto C2).
Soluzione
ESITO: fatto
COSA:
/runesegue decodifica e grafo inasyncio.to_threadcon timeoutVISION_RUN_TIMEOUT_S(100 s) → 504; semaforoVISION_MAX_CONCURRENCY(2) → 503;/healthrisponde durante i calcoli (test). Il thread scaduto non è interrompibile: documentato.COMMIT (ramo lavoro/jeeg, unito su V3.0.0 a
d483fa1):b150378PROVA:
uv run --extra server --extra client --extra dev pytest -q→ 622 passed, 4 skipped (erano 391); visione su Python 3.13 → 16 passed (erano 8).