@mddoffguy

Python Telegram bot: Как убить поток при любом исключении в основной части?

Допустим, у меня есть телеграм бот на Telebot, который бесконечно крутится на сервере с pm2 (авторестарт при исключении).

У меня есть поток рассылки (threading библиотека) сообщений, который отсылает всем пользователям сообщения каждый день например.

Но бывает такая ситуация, что у меня выбивает исключение в другой части бота (вне потока). Как можно при любом исключении убивать поток и уже через pm2 авто рестартить бота? Завернуть всё в try как понятно не вариант, и где возникнет исключение я не знаю.

UPD: Обернуть старт бота в try не могу, т.к бот разбит на файлы с классами и методами, которые вызываются от хуков
  • Вопрос задан
  • 195 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Просто сделай поток демоном через параметр в threading.Thread.
If not None, daemon parameter explicitly sets whether the thread is daemonic. If None (the default), the daemonic property is inherited from the current thread.

Это поможет вот почему:

daemon
A boolean value indicating whether this thread is a daemon thread (True) or not (False). This must be set before start() is called, otherwise RuntimeError is raised. Its initial value is inherited from the creating thread; the main thread is not a daemon thread and therefore all threads created in the main thread default to daemon = False.
The entire Python program exits when no alive non-daemon threads are left.

Выделение моё.

Ну а если у тебя есть неподконтрольные тебе недемонические потоки, то тогда придётся заворачивать основного бота в try catch. И да, то что "бот разбит на файлы с классами и методами" абсолютно ничего не меняет. Если бот синхронный, у него есть точка входа, где ты запускаешь его работу, и любое непойманное исключение в этом потоке всплывёт только там. Если бот асинхронный, то нужно реагировать на непойманные исключения в корутинах - читай доки на asyncio как это сделать.
Ну и оптимальное решение - разобраться уже, где всплывает исключение, понять его причину, и исправить.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы