You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 02:12:21