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

