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
问题是你的装饰器不返回协程函数。 PTB 期望所有回调函数都是可以进行
async def
编辑的协程函数 (await
),因此您的处理程序必须返回这样的函数。
但是,我确实想指出,启动线程似乎不是最好的解决方案。可供考虑的替代方案:
asycnio.sleep
而不是time.sleep
)loop.run_in_excutor
免责声明:我目前是
python-telegram-bot
的维护者。
是的。谢谢你的建议。 但是现在我的命令任务有很多同步请求http代码。很难更改为异步代码。 使用线程对我们来说是目前更好的解决方案。 那么如果使用线程,如何解决“object NoneType can't be use in 'await' expression”异常?