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

如何在Pyrogram中正确停止并启动机器人(非重启)

解决机器人停止后延迟重启的问题

核心原因

调用stop()后,机器人客户端的内部资源(如事件循环、网络连接、更新监听线程)会被释放或终止,直接调用start()无法重新激活这些资源,导致无法接收更新。

解决方案

方案1:重新初始化客户端实例

放弃复用旧的客户端实例,在延迟后创建全新实例并启动:

import time
from your_bot_library import Bot

def run_bot():
    bot = Bot(token="YOUR_TOKEN")
    # 注册你的命令、事件处理器
    bot.start()

# 首次启动
run_bot()

# 停止后等待5分钟
time.sleep(300)

# 延迟后重启(创建新实例)
run_bot()

如果是异步框架(如python-telegram-bot v13+),不要用time.sleep,改用异步延迟避免阻塞事件循环

方案2:异步框架下控制监听任务启停

针对异步机器人框架,可以只暂停更新监听任务,而非完全销毁客户端:

import asyncio
from your_bot_library import Bot

async def main():
    bot = Bot(token="YOUR_TOKEN")
    await bot.initialize()  # 先完成初始化,不启动监听
    
    # 启动更新监听任务
    update_task = asyncio.create_task(bot.start_polling())
    
    # 运行一段时间后停止监听
    await asyncio.sleep(300)
    update_task.cancel()
    await bot.stop_polling()
    
    # 等待10分钟后重启
    await asyncio.sleep(600)
    
    # 重新启动监听
    update_task = asyncio.create_task(bot.start_polling())
    await update_task

asyncio.run(main())

这种方式保留了客户端实例,仅暂停/恢复更新轮询流程,避免重复初始化开销。

方案3:同步框架下用线程管理启停

对于同步机器人框架,用线程封装运行逻辑,停止后销毁线程,延迟后新建线程重启:

import time
import threading
from your_bot_library import Bot

# 全局变量用于控制停止(或用类封装管理)
bot_instance = None

def bot_thread():
    global bot_instance
    bot_instance = Bot(token="YOUR_TOKEN")
    bot_instance.start()

# 启动第一个线程
t = threading.Thread(target=bot_thread)
t.start()

# 运行一段时间后停止机器人
time.sleep(300)
bot_instance.stop()
t.join()

# 延迟10分钟重启
time.sleep(600)
t = threading.Thread(target=bot_thread)
t.start()

注意事项

  • 不同机器人框架的启停逻辑有差异,需根据实际使用的框架(如Telegram Bot、Discord Bot)调整代码
  • 若使用webhook模式,停止后需重新配置webhook再启动服务,不能直接调用start()
  • 延迟重启前要确保旧的机器人进程/线程完全终止,避免资源泄漏

内容的提问来源于stack exchange,提问作者Efim Rubin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:53:24