用线程包装器异常装饰 python-telegram-bot 异步函数

问题描述 投票:0回答:2

python-telegram-bot 文档: 从 v20.0 开始,python-telegram-bot 构建在 Python 的 asyncio 模块之上。由于 asyncio 通常是单线程的,因此 python-telegram-bot 目前并不打算实现线程安全。

如果机器人命令执行一些长时间的工作,将阻止整个BOT接收和发送消息。所以我想使用包装器来执行机器人命令任务。 以下是我的代码。测试命令可以正常执行。 但我得到异常对象 NoneType 不能在“等待”表达式中使用。 所以某个地方应该有磨损。

def asyncbot(mythread):
    def wrapper(*args, **kwargs):  
        def wrap_async_func(*args, **kwargs):
            asyncio.run(mythread(*args, **kwargs))
        _thread = Thread(target=wrap_async_func, args=args, kwargs=kwargs)
        _thread.start()
    return wrapper

@asyncbot
async def test(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    sleep(20)

记录:

处理更新更新时引发异常=

“无”

    context.chat_data = None
    
    context.user_data = None

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/dist-packages/telegram/ext/_jobqueue.py", line 898, in _run
    await self.callback(context)
TypeError: object NoneType can't be used in 'await' expression
multithreading async-await wrapper python-telegram-bot
2个回答
0
投票

问题是你的装饰器不返回协程函数。 PTB 期望所有回调函数都是可以进行

async def
编辑的协程函数 (
await
),因此您的处理程序必须返回这样的函数。

但是,我确实想指出,启动线程似乎不是最好的解决方案。可供考虑的替代方案:


免责声明:我目前是

python-telegram-bot
的维护者。


0
投票

是的。谢谢你的建议。 但是现在我的命令任务有很多同步请求http代码。很难更改为异步代码。 使用线程对我们来说是目前更好的解决方案。 那么如果使用线程,如何解决“object NoneType can't be use in 'await' expression”异常?

© www.soinside.com 2019 - 2024. All rights reserved.