Telethon异步收消息同步发送问题:sleep方法异常排查
问题分析与解决
核心问题
time.sleep(2)的问题:这是同步阻塞函数,会卡住整个Python进程,包括Telethon的事件循环,导致期间完全无法接收消息。asyncio.sleep(2)无效的问题:你用了telethon.sync的同步客户端,且没有用await调用asyncio.sleep,它只会返回一个未执行的协程对象,根本不会触发休眠。- 同步客户端的
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
相关产品推荐
相关产品推荐

