Вопрос об асинхронной обработке в python-telegram-botPython

Программы на Python
Anonymous
Вопрос об асинхронной обработке в python-telegram-bot

Сообщение Anonymous »

Изменить:
Этот вопрос устарел, так как после 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))
После того, как пользователь вводит эту функцию с помощью «/main», он или она получает сообщение, содержащее число, которое увеличивается каждую секунду, и это займет вечность.
Что-то, что я пробовал:
  • Разработать другой MessageHandler, если пользователь отправляет некоторые ключевые слова, например " stop", он изменяет значение глобальной переменной. В цикле он проверяет, имеет ли эта переменная значение True каждый раз перед добавлением числа. Если оно было False, оно прерывается.
    Однако MessageHandler не обнаружит это сообщение до фактического завершения цикла, поэтому это бессмысленно.
  • Включите InlineKeyboard в сообщение , с кнопкой «Стоп». Создайте другой CallbackQueryHandler для обработки этой кнопки.
    Аналогично, CallbackQueryHandler получит обратный вызов только после завершения цикла. Это можно проверить, если я установлю прерывание вручную, когда счетчик достигнет числа, например 5 или чего-то подобного.
Я думал, смогу ли я разработать какую-нибудь функцию прерывания, работающую асинхронно, но лично я не очень знаком с асинхронностью в Python. После некоторых попыток, таких как установка async def или CallbackQueryHandler(query_handle, run_async = True), мне так и не удалось добиться такого эффекта.
Я заметил, что есть декоратор вызывается из telegram.ext.dispatcher import run_async, это помогает? Или есть ли другой способ реализовать этот результат?
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/711 ... legram-bot

Вернуться в «Python»