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

python-telegram-bot中JobQueue run_once不稳定问题求助

问题描述

我开发的机器人需要每日读取员工提醒并在指定时间发送,使用run_daily在本地时间00:05更新任务列表,通过run_once(将本地时间转换为UTC)发送提醒。机器人前几日运行正常,后续出现问题:要么提醒发送零散、部分员工未收到,要么run_daily未触发。日志显示有3个任务出现Run time of job错误。另有同类型v15版本机器人运行稳定,但无法回滚至该版本。附上相关代码及运行日志,求解决方案。

run_once 代码

active_jobs = context.job_queue.jobs()
active_jobs = [job.schedule_removal() for job in active_jobs if job.name != 'Auto generate']  # Delete active jobs before to add new

# Create task for run_once
notif = NotifPlant(**notification)

date_time = datetime.datetime(date_time_now.year, date_time_now.month, date_time_now.day, notif.hour, notif.min)
date_time = time_to_utc(date_time, configs.TIME_ZONE_STR)
context.job_queue.run_once(
            callback=send_notification,
            when=date_time,
            data=notif,  # dict with data
            name=str(notif.id_tel)
        )

run_daily 代码

def auto_generate_notification(application):
    func = get_notification

    time_to_call_func = time(
        hour=0, minute=5, tzinfo=pytz.timezone(configs.TIME_ZONE_STR)
    )
    application.job_queue.run_daily(callback=func, time=time_to_call_func, name='Auto generate')
    logging.info('АВТООБНОВЛЕНИЕ — {datetime.datetime.now(tz=pytz.timezone(configs.TIME_ZONE_STR))}')

运行日志

2023-11-21 10:01:02,982 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot6281555078:AAEBaCiRDjn-WjQAhj5VE-dEAkB_WNA-qTg/getUpdates "HTTP/1.1 200 OK"
2023-11-21 10:01:20,132 - apscheduler.scheduler - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts
2023-11-21 10:01:20,134 - root - INFO - АВТООБНОВЛЕНИЕ — 2023-11-21 17:01:20.133789+07:00
2023-11-21 10:01:20,394 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot6281555078:AAEBaCiRDjn-WjQAhj5VE-dEAkB_WNA-qTg/getMe "HTTP/1.1 200 OK"
2023-11-21 10:01:20,442 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot6281555078:AAEBaCiRDjn-WjQAhj5VE-dEAkB_WNA-qTg/deleteWebhook "HTTP/1.1 200 OK"
2023-11-21 10:01:20,447 - apscheduler.scheduler - INFO - Added job "Auto generate" to job store "default"
2023-11-21 10:01:20,447 - apscheduler.scheduler - INFO - Scheduler started
2023-11-21 10:01:20,447 - telegram.ext.Application - INFO - Application started
2023-11-21 10:01:20,580 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot6281555078:AAEBaCiRDjn-WjQAhj5VE-dEAkB_WNA-qTg/getUpdates "HTTP/1.1 200 OK"
2023-11-21 10:01:25,926 - apscheduler.scheduler - INFO - Added job "189198380" to job store "default"
2023-11-21 10:01:25,928 - apscheduler.scheduler - INFO - Added job "434001077" to job store "default"
2023-11-21 10:01:25,928 - apscheduler.scheduler - INFO - Added job "368856606" to job store "default"
2023-11-21 10:01:25,929 - apscheduler.scheduler - INFO - Added job "1705470860" to job store "default"
2023-11-21 10:01:25,929 - apscheduler.scheduler - INFO - Added job "476787052" to job store "default"
2023-11-21 10:01:25,930 - apscheduler.scheduler - INFO - Added job "1387994997" to job store "default"
2023-11-21 10:01:25,930 - apscheduler.scheduler - INFO - Added job "368856606" to job store "default"
2023-11-21 10:01:25,931 - apscheduler.scheduler - INFO - Added job "434001077" to job store "default"
2023-11-21 10:01:25,934 - apscheduler.scheduler - INFO - Removed job 5aa7fc9dab4941668ba29dae1e2540a7
2023-11-21 10:01:25,934 - apscheduler.scheduler - INFO - Removed job a93566ed31c44a35b577c1b8f8f87bfb
2023-11-21 10:01:25,935 - apscheduler.scheduler - INFO - Removed job 03ffdb9d0f364602813f54dfa12af8ec
2023-11-21 10:01:25,937 - apscheduler.executors.default - WARNING - Run time of job "368856606 (trigger: date[2023-11-21 05:00:00 UTC], next run at: 2023-11-21 05:00:00 UTC)" was missed by 5:01:25.937786
2023-11-21 10:01:25,938 - apscheduler.executors.default - WARNING - Run time of job "434001077 (trigger: date[2023-11-21 05:00:00 UTC], next run at: 2023-11-21 05:00:00 UTC)" was missed by 5:01:25.938192
2023-11-21 10:01:25,938 - apscheduler.executors.default - WARNING - Run time of job "368856606 (trigger: date[2023-11-21 09:45:00 UTC], next run at: 2023-11-21 09:45:00 UTC)" was missed by 0:16:25.938356
2023-11-21 10:01:26,168 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot6281555078:AAEBaCiRDjn-WjQAhj5VE-dEAkB_WNA-qTg/sendMessage "HTTP/1.1 200 OK"
解决方案
  • 处理任务错过执行时间问题:从日志看,添加任务时已经过了触发时间,APScheduler默认会跳过这类任务。可以在创建run_once任务前判断date_time是否早于当前UTC时间,如果是,就把日期加一天再转换UTC;或者给run_once添加misfire_grace_time参数,允许错过一定时间内的任务仍执行,比如misfire_grace_time=3600(1小时)。
  • 避免任务重复添加:日志里出现同一个员工ID的任务被多次添加,导致冲突。添加新任务前,不要只依赖批量删除,应该精准删除同名任务:用context.job_queue.get_jobs_by_name(str(notif.id_tel))获取所有同名任务,逐个调用remove()(同步删除),确认删除完成后再添加新任务。
  • 确保run_daily只被初始化一次:auto_generate_notification如果被多次调用,会重复添加同名的每日任务,导致调度混乱。可以在启动时先检查是否存在名为'Auto generate'的任务,只有不存在时才添加:
    existing_jobs = application.job_queue.get_jobs_by_name('Auto generate')
    if not existing_jobs:
        application.job_queue.run_daily(...)
    
  • 同步处理任务删除:原代码用schedule_removal()是异步操作,可能删除还没完成就添加新任务,导致旧任务没删干净。改用job.remove()同步删除,或者等待删除操作完成后再执行添加逻辑。
  • 校验时区转换准确性:检查time_to_utc函数是否正确处理了本地时区到UTC的转换,比如是否考虑了夏令时、时区偏移计算错误等问题。可以用pytz的标准转换方法替代自定义函数,确保时间准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 19:22:02