如何在AWS Lambda上使python-telegram-bot执行完job_queue后优雅停止
解决方案
在AWS Lambda环境下,你不需要启动机器人的更新轮询(run_polling),因为你的需求只是执行一次性任务后优雅退出。以下是修改后的代码,完全适配Lambda的短运行时特性:
import asyncio from telegram.ext import ApplicationBuilder # 替换为你的机器人Token BOT_TOKEN = "YOUR_BOT_TOKEN" async def check_promotion(context): # 这里写你的任务逻辑 print("执行促销检查任务...") # 任务完成后无需额外操作,后续会自动停止事件循环 async def execute_jobs(): # 初始化Application,仅用于创建JobQueue application = ApplicationBuilder().token(BOT_TOKEN).build() job_queue = application.job_queue # 添加10秒后执行的一次性任务 job = job_queue.run_once(check_promotion, 10) # 启动Application的必要组件(仅初始化JobQueue,不启动更新轮询) await application.start() # 等待任务完成 await job.done() # 优雅关闭Application和释放资源 await application.stop() def main(event, context): print("初始化任务执行环境...") # 运行异步任务流程 asyncio.run(execute_jobs()) print("任务执行完成,已优雅退出")
关键修改说明
- 移除无用Handler:你不需要接收任何Telegram消息更新,所以删除了
CommandHandler相关代码,减少资源占用。 - 抛弃
run_polling:该方法会持续轮询Telegram服务器获取更新,完全不符合Lambda短运行时的场景,改用直接控制异步任务生命周期。 - 优雅的任务等待与停止:通过
await job.done()等待任务执行完成,再调用application.stop()释放所有资源,避免强制终止带来的问题。 - 适配Lambda同步Handler:用
asyncio.run()将异步任务包装在同步的main函数中,符合Lambda的执行模型。
内容的提问来源于stack exchange,提问作者NSD
相关产品推荐
相关产品推荐

