Files
drhider/History/2026-07-14-sse-generator-exit.md
naeel 79cd25a762
Deploy drhider / validate (push) Waiting to run
fix: SSE — отлов GeneratorExit при отключении клиента
- api_bp.py: try/except GeneratorExit после каждого yield в generate()
- при F5 во время обработки поток освобождается, остальные файлы не обрабатываются
- bump: 0.0.17 → 0.0.18
2026-07-14 09:15:44 +04:00

2.0 KiB

SSE: отлов отключения клиента, v0.0.18

Дата: 2026-07-14
Версия: 0.0.17 → 0.0.18


Проблема

После 2-3 F5 во время обработки — загрузка падает с «Ошибка загрузки: Сеть». Причина: утечка потоков.

Механика

  1. process_stream создаёт SSE-генератор, занимающий поток Waitress (всего 8)
  2. obfuscate_files() выполняется ~30 сек (LLM-запросы)
  3. Пользователь делает F5 → TCP-соединение рвётся
  4. Генератор не знает что клиент отключился — продолжает обрабатывать файлы
  5. Поток занят, не освобождается
  6. 2-3 F5 → все 8 потоков заняты → новые запросы не принимаются → «Сеть»

Почему WSGI не отключает

yield в генераторе пишет в буфер WSGI, а не в сокет. Буфер никуда не уходит (клиент отключён), но генератор об этом не узнаёт — GeneratorExit не кидается.


Решение

Добавлен try/except GeneratorExit после каждого yield в generate():

try:
    yield f"event: done..."
except GeneratorExit:
    return  # клиент отключился, освобождаем поток, НЕ обрабатываем остальные файлы

Waitress при отключении клиента кидает GeneratorExit при попытке записи в закрытый сокет. Генератор ловит → выходит → поток освобождается.


Изменённые файлы

  • site/routes/api_bp.pytry/except GeneratorExit в generate()
  • site/app.pyVERSION = "0.0.18"