如何解决Python中Telegram Bot测试的asyncio TimeoutError问题?
解决Telegram Bot长任务测试超时问题
问题分析
你在测试Telegram Bot的长运行任务(需超10分钟)时,已将相关超时参数设为600秒,但仍在15秒左右收到asyncio.exceptions.TimeoutError,核心原因是tgintegration的BotController或collect方法存在未覆盖的默认超时设置,或者参数配置未生效。
解决方案
1. 显式给collect方法传递超时参数
collect方法可能未继承controller的全局设置,需在调用时直接指定超时参数:
async with controller.collect(count=7, max_wait=600, wait_consecutive=600) as response: await controller.send_command("compute")
2. 设置Pyrogram客户端级超时
Pyrogram的Client默认超时较短,初始化时需显式配置:
def create_client(session_name: str = SESSION_NAME) -> Client: return Client( name=session_name, api_id=os.getenv("API_ID"), api_hash=os.getenv("API_HASH"), timeout=600 # 客户端全局超时设为600秒 )
3. 移除冗余的双重超时包裹
如果已通过controller参数设置足够长的超时,无需额外用async_timeout.timeout包裹,避免冲突:
# 移除此行:async with timeout(600): async with controller.collect(count=7, max_wait=600, wait_consecutive=600) as response: await controller.send_command("compute")
4. 验证消息数量匹配性
如果Bot实际发送的消息数少于count=7,collect会持续等待直到超时。可先降低count测试,或添加日志跟踪:
async with controller.collect(count=7, max_wait=600, wait_consecutive=600) as response: await controller.send_command("compute") print(f"已收到消息数:{len(response.messages)}")
5. 调整消息轮询间隔
适当调大wait_interval减少轮询频率,同时保证不会遗漏消息:
controller.wait_interval = 10 # 每10秒检查一次新消息
内容的提问来源于stack exchange,提问作者Geiser
相关产品推荐
相关产品推荐

