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

Telethon异步收消息同步发送问题:sleep方法异常排查

问题分析与解决

核心问题

  1. time.sleep(2)的问题:这是同步阻塞函数,会卡住整个Python进程,包括Telethon的事件循环,导致期间完全无法接收消息。
  2. asyncio.sleep(2)无效的问题:你用了telethon.sync的同步客户端,且没有用await调用asyncio.sleep,它只会返回一个未执行的协程对象,根本不会触发休眠。
  3. 同步客户端的forward_messages是同步调用,且循环放在事件循环启动前执行,本身就和异步事件处理逻辑冲突。

解决方案

改用Telethon的异步模式编写代码,所有异步方法必须用await调用,用await asyncio.sleep()实现非阻塞休眠,同时保证事件循环能正常处理消息。

修正后的代码

import asyncio
import logging
from telethon import TelegramClient, events  # 移除sync导入,使用原生异步客户端

lstDatas = [52, 58, 995, 477, 1447, 885, 6697, 1845, 1002]

async def main():
    async with TelegramClient('anon', api_id, api_hash) as client:
        @client.on(events.NewMessage(from_users=[botRand1mmm]))
        async def my_event_handler(event):
            # 异步方法必须用await调用
            await client.send_message(entity='botRand0mmm', message=event.message)

        # 异步循环处理转发任务
        for m in lstDatas:
            # 异步forward_messages需要await
            await client.forward_messages(
                from_peer='botRand0mmm',
                entity='botRand1mmm',
                messages=m,
                background=True
            )
            # 非阻塞休眠,期间事件循环可正常处理消息接收
            await asyncio.sleep(2)
        
        # 保持客户端运行,持续处理消息
        await client.run_until_disconnected()

if __name__ == "__main__":
    asyncio.run(main())

关键改动说明

  • 移除telethon.sync导入,使用Telethon原生异步客户端,避免同步逻辑干扰事件循环。
  • 所有Telethon异步方法(send_message、forward_messages、run_until_disconnected)都添加await,确保方法执行完成。
  • 将转发循环放在异步主函数内,用await asyncio.sleep(2)实现非阻塞休眠,此时事件循环可以同时处理新消息的接收与响应。
  • 用asyncio.run()启动异步主函数,保证事件循环正常初始化和运行。

内容的提问来源于stack exchange,提问作者ngk32

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:02:33