@Kataan

Как остановить выполнение функции в тг боте?

Есть бот, он парсит инфу
@dp.message_handler(text=["Ёлки"])
async def Trees(message: types.Message):
    cards = trees() #ФУНКЦИЯ ПАРСИНГА
    for card in cards:
        result = f""
        for item in card:
        result += f"{item}\n"
        await message.answer(result, 
        reply_markup=stopkeyboard)
        sleep(1)

@dp.message_handler(text=["⛔STOP⛔"])
    async def Stop(message: types.Message):


Парсинг идет долго, нужно чтобы все останавливалось по кнопке stop
Помогите, уже сломал голову
  • Вопрос задан
  • 102 просмотра
Пригласить эксперта
Ответы на вопрос 2
@dima20155
you don't choose c++. It chooses you
Самое банальное - можно добавить в функцию парсинга проверку флага остановки. Если флаг остановки становится True, то завершать парсинг даже если он не закончен до конце (или что-то другое по вашему выбору).
Если более общий совет - каким-то образом необходимо внешне мониторить состояние функции (задачи) парсинга, например, обмениваться сообщениями, семафорами и т.д.
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
cards = trees() #ФУНКЦИЯ ПАРСИНГА
Ну вот тут уже проблема. Ты в асинхронном боте делаешь длительный синхронный вызов.
Перепиши свой парсер на асинхронный код, запусти его через asyncio.create_task() и сохрани полученный объект задачи в глобальную переменную (если у тебя может быть не более одного активного парсера).
Для отмены проверь, что в глобальной переменной лежит не None, а искомый объект. Если так, то вызови у него метод cancel().
Это спровоцирует исключение CancelledError в функции парсера, что позволит прервать её выполнение, но в то же время аккуратно отработать освобождению ресурсов и т.п.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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