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
相关产品推荐
相关产品推荐

