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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:15:08