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

Colab中Pyrogram机器人线程卡bot.start() 需所有单元格运行完才执行

问题原因

  • Pyrogram v2+ 所有接口底层均基于异步实现,对外提供的同步方法是带运行环境自动检测的包装层:如果检测到当前线程存在已运行的Asyncio事件循环,就会直接返回协程对象;如果没有,则会自动创建事件循环执行异步逻辑。
  • Colab 主线程默认始终运行着IPython的全局Asyncio事件循环,所以主线程直接调用同步Pyrogram方法只会得到协程,无法直接执行。
  • 你创建的新线程默认不会继承主线程的事件循环,但Colab单元格处于运行状态时,全局任务调度会优先分配资源给单元格主线程的任务,新线程里Pyrogram创建的事件循环得不到CPU调度,因此会卡在bot.start()步骤,直到单元格主线程空闲(所有单元格运行完毕)才会执行。

解决方案1:直接使用异步API(最推荐,无需额外线程)

Colab 原生支持顶层await语法,不需要额外封装线程,直接写异步逻辑即可,代码如下:

from pyrogram import Client
import asyncio

BOT_TOKEN = "你的bot token"
APP_ID = 你的api_id
API_HASH = "你的api_hash"

async def main():
    async with Client("Me", bot_token=BOT_TOKEN, api_id=APP_ID, api_hash=API_HASH, no_updates=True) as bot:
        await bot.send_message(chat_id="...", text="how")

await main()

直接运行该单元格即可正常执行,不会出现卡住的问题。

解决方案2:坚持使用线程+同步API的修复方案

如果一定要用同步写法+多线程的结构,需要手动给新线程绑定独立的事件循环,避免和Colab全局调度冲突,修改后的代码如下:

from pyrogram import Client
import threading
import asyncio

bot=Client("Me", bot_token=BOT_TOKEN, api_id=APP_ID, api_hash=API_HASH,no_updates=True)

def main():
    # 给当前线程手动创建并设置独立的事件循环
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    try:
        bot.start()
        bot.send_message(chat_id="...",text="how")
        bot.stop()
    finally:
        loop.close()

t=threading.Thread(target=main)
t.start()
# 如果需要等线程执行完再结束单元格,可添加下行代码
# t.join()

修改后运行单元格不会再卡在bot.start()步骤,线程会立即执行逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:12:03