在Google Colab Pro Plus运行Telethon关闭标签重开报错如何解决
问题原因
- Colab Pro+的后端运行时不会随前端标签页关闭而终止,你首次执行的Telethon客户端实例、asyncio事件循环仍在后台运行,重开标签页后再次运行代码会尝试重复进入已激活的客户端上下文,直接触发
RuntimeError: cannot enter context报错。 - 代码中使用的
nest_asyncio.apply()放开了事件循环嵌套限制,重跑时新提交的协程会和旧事件循环中残留的客户端回调逻辑冲突,进而触发回调类异常。
修复方案
修复后代码
from telethon.sync import TelegramClient, events, Button from telethon.sessions import StringSession from telethon import functions, types import asyncio import nest_asyncio nest_asyncio.apply() # 替换为自己的实际配置 api_id = 你的API_ID api_hash = '你的API_HASH' session='你的会话字符串' # 全局变量存储客户端实例,方便重跑时清理残留 client = None async def main(): global client # 先清理之前残留的客户端连接 if client and client.is_connected(): await client.disconnect() # 初始化新客户端 client = TelegramClient(StringSession(session), api_id, api_hash) async with client: print("Inside") # 替换为你要监听的会话ID @client.on(events.NewMessage(chats=[xxxxxxxxxx])) async def my_event_handler(event): print(event.raw_text) while True: # 你自己的业务逻辑 await asyncio.sleep(0.03) # 重跑时先清理当前事件循环里的残留任务 try: loop = asyncio.get_running_loop() # 取消所有旧的未完成任务 for task in asyncio.all_tasks(loop): task.cancel() except RuntimeError: # 没有正在运行的循环则新建 loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.run_until_complete(main())
额外操作说明
- 重开标签页后首次运行如果还有报错,先单独执行
await client.disconnect()清理残留连接,再运行主代码即可。 - 也可以直接重启Colab运行时:点击顶部菜单栏「代码执行程序」→「重新启动代码执行程序」,清空整个后端环境后再运行代码,可彻底消除残留冲突。
内容的提问来源于stack exchange,提问作者lukky
相关产品推荐
相关产品推荐

