fix: SSE-Broadcaster nur 1 Worker - sonst Events zwischen Prozessen verloren

Mit 2 Gunicorn-Workern laeuft der In-Memory-Broadcaster in zwei
voneinander getrennten Prozessen. Landet ein Lock-Request auf
Worker A und die SSE-Verbindung des Empfaengers auf Worker B, kommt
das Event nie beim Client an - genau deshalb klappte der Live-
Refresh bei freigegebenen Ordnern nicht zuverlaessig.

Jetzt: 1 Worker mit 32 Threads. Threads teilen Memory, der
Broadcaster ist fuer alle Verbindungen derselbe. Fuer mehr Durchsatz
waere Redis Pub/Sub noetig - hier reicht aber Single-Process-Modus.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Stefan Hacker 2026-04-12 10:51:49 +02:00
parent 3af2bc3312
commit e3cf7b1b64
1 changed files with 5 additions and 3 deletions

View File

@ -35,9 +35,11 @@ ENV UPLOAD_PATH=/app/data/files
EXPOSE 5000
# gthread worker class so SSE long-poll connections don't starve regular requests.
# 2 workers x 16 threads = 32 concurrent slots; each SSE client just holds one thread.
# Single worker with many threads. The SSE broadcaster lives in process
# memory - mit mehreren Workern wuerden Events den Empfaenger nicht
# erreichen wenn Sender und Empfaenger auf verschiedenen Workern haengen.
# 32 Threads = bis zu 32 gleichzeitige Requests/SSE-Streams.
CMD ["gunicorn", "--bind", "0.0.0.0:5000", \
"--worker-class", "gthread", "--workers", "2", "--threads", "16", \
"--worker-class", "gthread", "--workers", "1", "--threads", "32", \
"--timeout", "120", "--keep-alive", "65", \
"wsgi:application"]