Этот вопрос устарел, так как после python-telegram-bot v20.0 он был переписан в асинхронном виде. Теперь все обратные вызовы должны быть асинхронными функциями.
Исходный вопрос:
Меня беспокоит вопрос. меня уже давно. Буду очень признателен за вашу помощь!
Представим такую ситуацию:
Вы ввели функцию по команде . В этой конкретной функции есть цикл, завершение которого занимает много времени, или, что еще хуже, на самом деле это бесконечный цикл. Вопрос в том, как можно прервать этот цикл или функцию, чтобы бот мог обрабатывать другие запросы?
Пример может быть таким:
Код: Выделить всё
def function(update, context):
counter = 0
message = update.message.reply_text(str(counter))
while True:
counter += 1
message = message.edit_text(text = str(counter))
time.sleep(1)
dispatcher.add_handler(CommandHandler("main", function))
Что-то, что я пробовал:
- Разработать другой MessageHandler, если пользователь отправляет некоторые ключевые слова, например " stop", он изменяет значение глобальной переменной. В цикле он проверяет, имеет ли эта переменная значение True каждый раз перед добавлением числа. Если оно было False, оно прерывается.
Однако MessageHandler не обнаружит это сообщение до фактического завершения цикла, поэтому это бессмысленно. - Включите InlineKeyboard в сообщение , с кнопкой «Стоп». Создайте другой CallbackQueryHandler для обработки этой кнопки.
Аналогично, CallbackQueryHandler получит обратный вызов только после завершения цикла. Это можно проверить, если я установлю прерывание вручную, когда счетчик достигнет числа, например 5 или чего-то подобного.
Я заметил, что есть декоратор вызывается из telegram.ext.dispatcher import run_async, это помогает? Или есть ли другой способ реализовать этот результат?
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/711 ... legram-bot