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

Python Telegram Bot:如何等待任务完成后停止Updater?

优化Telegram Bot单次任务执行后自动停止的方案

现有问题分析

用sleep(15)等待任务完成的方式不够可靠:任务可能提前完成却仍在空等,也可能因网络延迟等原因还没执行完就被强制停止,时间阈值很难精准匹配实际任务耗时。

方案一:任务完成后主动停止Updater

直接在任务函数执行完毕时触发Updater停止操作,替代固定时长的睡眠等待,确保任务完成后立刻终止程序。

修改后的代码:

from telegram.ext import Defaults, Updater, CallbackContext
from telegram import ParseMode

def my_job(context: CallbackContext):
    # 获取图片的逻辑(省略)
    pic = open("pic.png", "rb")
    context.bot.send_photo(
            chat_id=CHAT_ID,
            photo=pic,
            caption="caption",
        )
    pic.close()  # 务必关闭文件句柄
    # 任务完成后停止Updater
    context.dispatcher.updater.stop()

def main():
    defaults = Defaults(parse_mode=ParseMode.HTML)
    updater = Updater(BOT_TOKEN, defaults=defaults, workers=32)  # type: ignore
    
    j = updater.job_queue
    j.run_once(my_job, when=0)

    updater.start_polling(poll_interval=1.0, timeout=5.0)
    updater.idle()  # 等待Updater被停止,替代sleep

方案二:直接使用Bot实例执行单次任务

如果你的需求只是执行一次发送图片的任务,完全不需要启动Updater和JobQueue,直接创建Bot实例完成任务后即可退出,代码更轻量高效。

示例代码:

from telegram import Bot, ParseMode, Defaults
from telegram.error import TelegramError

def main():
    defaults = Defaults(parse_mode=ParseMode.HTML)
    bot = Bot(token=BOT_TOKEN, defaults=defaults)
    
    try:
        # 获取图片的逻辑(省略)
        pic = open("pic.png", "rb")
        bot.send_photo(
            chat_id=CHAT_ID,
            photo=pic,
            caption="caption",
        )
        pic.close()
    except TelegramError as e:
        print(f"发送图片失败:{e}")
    # 任务完成直接退出程序
    exit()

方案选择

  • 若后续可能扩展Bot功能(比如添加定时任务、消息监听),优先选择方案一;
  • 若仅需单次执行发送任务,方案二更简洁,资源消耗更低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:52:21