Pyrogram PingTask冻结问题:发送媒体组时程序无响应
问题分析与解决方案
你的Pyrogram异步发送函数运行时卡在PingTask started日志,程序一直处于等待发送状态,结合代码和现象,可能的原因及解决方法如下:
1. 媒体组发送逻辑错误
当前代码循环单张图片发送媒体组,每张图单独创建一个仅含自身的media_group并调用send_media_group,这种用法不符合Telegram API的媒体组设计,频繁的单媒体请求会导致客户端任务队列阻塞,进而引发PingTask卡住。
修改为一次性收集所有图片到媒体组后发送:
async def send_message(chat_id: int): image_files = get_image_files() if not image_files: try: await app.send_message(chat_id, "1") logger.info(f"Бот успешно отправил сообщение в чат: {chat_id}") except Exception as e: logger.error(f"Ошибка при отправке сообщения в чате {chat_id}: {e}") else: media_group = [] # 先收集所有图片到媒体组 for index, image_file in enumerate(image_files): with open(f"images/{image_file}", "rb") as file: if index == 0: media_group.append(InputMediaPhoto(file, caption="photo caption")) else: media_group.append(InputMediaPhoto(file)) # 一次性发送整个媒体组 try: await app.send_media_group(chat_id, media_group) logger.info(f"Бот успешно отправил медиа-группу в чат: {chat_id}") except Exception as e: logger.error(f"Ошибка при отправке медиа-группы в чате {chat_id}: {e}")
2. 事件循环管理问题
确保你的异步代码是在正确的事件循环中运行:
- 如果是独立脚本,使用Pyrogram的
Client.run()来启动客户端和事件循环,而非手动管理asyncio循环; - 若在自定义循环中运行,需确保循环未被阻塞,所有异步调用都正确使用
await或asyncio.create_task()。
3. 客户端配置优化
初始化Pyrogram Client时,添加超时和重连参数,避免因网络或API响应慢导致卡住:
from pyrogram import Client app = Client( "my_bot", api_id=YOUR_API_ID, api_hash=YOUR_API_HASH, bot_token=YOUR_BOT_TOKEN, timeout=30, # 设置请求超时时间 reconnect=True # 开启自动重连 )
4. 增加调试日志定位卡点
在函数关键步骤添加日志,确认程序具体卡在哪个环节:
async def send_message(chat_id: int): logger.info(f"开始处理发送请求,chat_id: {chat_id}") image_files = get_image_files() logger.info(f"获取到图片文件列表: {image_files}") if not image_files: logger.info("无图片文件,准备发送文本消息") # 后续代码... else: logger.info(f"准备发送{len(image_files)}张图片的媒体组") # 后续代码...
通过以上步骤排查和修改,应该能解决PingTask卡住、程序等待发送的问题。
内容的提问来源于stack exchange,提问作者frexget
相关产品推荐
相关产品推荐

