@Maxwell012

Как закончить функции вызванные через asyncio.gather()?

Мой код:
try:
        tasks = [
            asyncio.create_task(start_notifier(bot), ),
            asyncio.create_task(dp.start_polling(bot))
        ]
        await asyncio.gather(*tasks, return_exceptions=True)
    except Exception as ex:
        main_logger.critical(f"Bot stopped due to exception: {ex}", exc_info=True)
        # await dp.start_polling(bot)  # restart the bot
    finally:
        await bot.send_message(chat_id=Config.ADMIN_ID, text="<b>BOT STOPPED</b>")
        await bot.session.close()

Я вызываю 2 метода через asyncio.gather(), первый это телеграм бот и второй это метод которые отправляет сообщения. Проблема в том что после запуска и попытки остановить процес с помощью Ctrl + C ничего не происходит так как asyncio просто игнорирует это. Даже если я получаю ошибку от телеграм бота, скрипт все равно не заканчивает работа так как нотификатор продолжает работать, нотификатор это закольцованный метод (и в итоге, код работает безконечно пока я его принудительно не остановлю через пайчарм, но если это на сервере, то мне приходиться выходить с сервера чтобы сервер принудительно закончил мою программу), а ошибку от телеграмм бота я тоже не могу отловить так как asyncio перехватывает ее. Я пробовывал выставить параметр return_exceptions как True но это не помогает, ошибку я все равно не получаю.
  • Вопрос задан
  • 183 просмотра
Решения вопроса 2
@Everything_is_bad
Зачем ты вообще так криво стал делать, надо просто запустить dp.start_polling как рекомендовано в aiogram, а start_notifier перед этим запускать через dp.startup.register() или просто как create_task, не нужен тебе тут gather
ЗЫ ну и сразу разберись с webhook, прод боты лучше уж через него запускать

но если это на сервере, то мне приходиться выходить с сервера чтобы сервер принудительно закончил мою программу
а это что за? 100500 раз сказано, делайте сервис для systemd
Ответ написан
В добавок к замечанию насчёт best practices и корректного использования бота, для корректной обработки выхода из программы нужно добавить обработку сигналов SIGINT, SIGTERM - для плавного завершения работы программы. При получении сигнала нужно выйти из основного цикла.
https://stackoverflow.com/questions/1112343/how-do...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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