From e3cf7b1b64fec54e2c425146fe2f37051df5bee8 Mon Sep 17 00:00:00 2001 From: Stefan Hacker Date: Sun, 12 Apr 2026 10:51:49 +0200 Subject: [PATCH] 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) --- Dockerfile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index f25b16e..dc73438 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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"]