gpt4 book ai didi

python - 关于 python-telegram-bot 中异步处理的问题

转载 作者:行者123 更新时间:2023-12-05 02:32:45 30 4
gpt4 key购买 nike

有个问题困扰了我很久。非常感谢您的帮助!

让我们想象这样一种情况:

You entered a function by a command. In this particular function, there is a loop that takes a long time to finish, or worse, it is actually an infinite loop. The question is, how can you abort this loop or function so that the bot can handle other requests?

一个例子是这样的:

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,带有一个名为“Stop”的按钮。设计另一个 CallbackQueryHandler 来处理这个按钮。

    同样,CallbackQueryHandler 只会在循环结束后接收回调。如果我在计数器达到 5 之类的数字时设置手动 break 就可以验证这一点。

我在想是否可以设计某种异步运行的中止函数,但我个人对 Python 中的异步不是很熟悉。经过一些尝试,比如设置 async defCallbackQueryHandler(query_handle, run_async = True),我仍然无法产生这种效果。

我注意到有一个装饰器叫做 from telegram.ext.dispatcher import run_async,这有帮助吗?或者,有没有其他方法可以实现这个结果?

谢谢!

最佳答案

默认情况下,Dispatcher 会一一处理传入的更新。这就是为什么您的前两种方法不起作用的原因。您可以做的是在独立线程中运行循环。事实上,这就是 run_async 参数的用途 - 它与 asyncio 编程无关。参见 this wiki page有关 run_async 的详细信息。另请注意,PTB 的下一个主要版本将为 PTB 引入 asyncio - 请参阅 this announcement .

我想指出 while 循环 + time.sleep() 可能不是最好的主意,尤其是在 sleep 时间很长的情况下.另一种方法是安排重复作业。 PTB 具有内置的 JobQueue为此。


免责声明:我目前是 python-telegram-bot 的维护者。

关于python - 关于 python-telegram-bot 中异步处理的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71157034/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com