Telethon уже работает поверх asyncio, поэтому главная ошибка — пытаться «управлять» им как обычным sync-кодом. Нельзя бездумно вызывать тяжелые блокирующие функции внутри handler’ов: пока поток занят, весь бот тормозит. Если нужна сеть, файлы или CPU-обработка — выносите это в отдельную задачу или executor.
Базовое правило: один event loop на процесс, а не на каждую функцию. Для фоновых действий используйте asyncio.create_task(), для ожидания нескольких операций — gather(), для таймаутов — wait_for(). Это дает контроль над параллелизмом и помогает не терять ответы API при всплеске событий.
Второй слой — защита от гонок. Если один и тот же аккаунт шлет инвайты, читает чаты и парсит диалоги одновременно, ставьте asyncio.Lock на критические секции. Иначе ловите дубли, конфликт состояний и странные RPC-ошибки, которые на первый взгляд выглядят как «глюк Telethon».
Третий момент — отмена задач и shutdown. Скрипт должен завершаться чисто: закрыть клиент, дождаться фоновых задач, не оставлять подвисшие coroutines. Дебаг — наш лучший друг в борьбе с FloodWait. Логируйте исключения, время ожидания и количество активных задач.
Оптимизируем сессии, избегаем лимитов: правильная async-архитектура в Telethon важнее, чем «мощный» сервер.
Telethon мастерская
@telethon_workshops_ubt
Asyncio в Telethon: как не сломать цикл событий и не словить хаос
Этот пост опубликован в Telegram-канале Telethon мастерская. Подписаться можно по ссылке: @telethon_workshops_ubt.