Задать вопрос
  • Asyncio + PySide6 + Telethon: список чатов и треды грузятся 30 минут — где искать причину?

    @eminsk
    developer python, javascripts
    https://github.com/eminsk/RozittaParser
    все правки то что считал сделал там если какие вопросы пиши уже в моем репозитарии уже
    если какие будут вопросы.

    Резузультаты теста
    uv run pytest
    ============================= test session starts =============================
    platform win32 -- Python 3.14.3, pytest-9.0.2, pluggy-1.6.0
    rootdir: C:\proekts\RozittaParser
    configfile: pyproject.toml
    collected 86 items
    tests\test_core\test_database.py .................. [ 20%]
    tests\test_core\test_merger.py ............ [ 34%]
    tests\test_core\test_utils.py .............................. [ 69%]
    tests\test_features\test_export.py ........... [ 82%]

    Я разобрал код, и у тебя тут не одна причина, а несколько конкретных узких мест.
    Главное: это не “просто Telethon медленный”. В проекте есть реальные места, которые сами создают тормоза и database is locked.
    Что у тебя тормозит на самом деле
    - Список чатов тормозит не столько из-за get_dialogs(), сколько из-за доп. запросов после него: в features/chats/chats_api.py:183 список диалогов грузится один раз, но потом в features/chats/chats_api.py:229 для каждого канала идет GetFullChannelRequest, чтобы проверить linked group. Если каналов много, это уже пачка сетевых запросов.
    - Топики форума могут резко тормозить, если прямой API не срабатывает и код уходит в fallback-скан сообщений: features/chats/chats_api.py:381. Это уже не “получить список веток”, а “пройтись по сообщениям и угадать ветки”.
    - Текстовый парсинг у тебя явно ненормально медленный. Самая сильная причина, которую я вижу: очень агрессивное логирование. В features/parser/api.py:826 есть debug-лог практически на каждое сообщение, а в core/logger.py:124 и core/logger.py:197 файл-лог включен на DEBUG вообще для всего приложения. На больших чатах это легко убивает скорость.
    - В features/parser/api.py:530 ты вызываешь iter_messages(...) без wait_time. У Telethon на больших историях это часто добавляет внутренние паузы между запросами. Это не объясняет 4 часа целиком, но добавляет тормоз.
    - Еще один баг: по документации ты рассчитываешь на batch insert, но фактически во время основного прохода строки копятся в памяти и пишутся в БД только в самом конце: features/parser/api.py:387, features/parser/api.py:416. То есть во время “долгого парсинга текста” тормозит не SQLite, а сеть/логирование/итерация.
    Откуда берется database is locked
    Тут у тебя, похоже, смешиваются две разные блокировки.
    - Telethon session — это тоже SQLite. Если одновременно живы два TelegramClient на одном .session, получаешь тот же database is locked.
    - Архивная БД сообщений — отдельная SQLite, и она тоже может ловить lock.
    Самый опасный кусок у тебя тут: ui/main_window.py:1590.
    - Перед стартом ParseWorker окно ждет ChatsWorker и TopicsWorker только 30_000 мс.
    - Если загрузка чатов реально висит дольше, ты все равно потом стартуешь парсер: ui/main_window.py:1606.
    - Это значит, что ChatsWorker еще может держать Telethon session, а ParseWorker уже открывает новый TelegramClient.
    Это очень похоже на главный источник твоего периодического database is locked.
    То есть проблема не “SQLite плохой”, а “два клиента пересеклись по времени на одном session-файле”.
    Что я считаю корнем проблемы по приоритету
    1. Слишком подробный DEBUG-лог в файл на больших объемах — core/logger.py:124, core/logger.py:197, features/parser/api.py:826.
    2. Старт ParseWorker, пока ChatsWorker/TopicsWorker еще не закончили — ui/main_window.py:1590.
    3. Дорогие дополнительные запросы для linked group после get_dialogs() — features/chats/chats_api.py:229.
    4. Возможный fallback-скан топиков вместо прямого API — features/chats/chats_api.py:381.
    5. Batch insert реализован не так, как ожидается: запись откладывается до конца — features/parser/api.py:416.
    Почему твои цифры выглядят подозрительно
    - 48k текстовых сообщений за почти 4 часа — это слишком медленно.
    - Даже если Telegram иногда душит историю, это не должно быть настолько плохо на чистом тексте.
    - Значит, почти наверняка тормозит не только Telegram API, а еще и твоя обвязка вокруг него.
    Что я бы исправлял первым делом
    - Временно понизить файловый лог с DEBUG до INFO и убрать per-message debug-лог.
    - Не запускать ParseWorker, если ChatsWorker или TopicsWorker еще живы. Не “подождать 30 секунд”, а именно не запускать вообще до полного завершения.
    - В iter_messages(...) явно задать wait_time=0 или маленькое значение и заново замерить.
    - Кэшировать linked-group данные, чтобы не делать GetFullChannelRequest для каждого канала каждый раз.
    - Писать batch в БД периодически по ходу парсинга, а не только в конце.
    - Добавить retry на lock в insert_messages_batch() и upsert_messages_batch() в core/database.py:351 и core/database.py:402.
    Ответ написан