Python APScheduler缺火测试

Python APScheduler缺火测试,python,apscheduler,Python,Apscheduler,我正在尝试使用APScheduler测试失败的任务,但在重新启动APScheduler时,没有看到丢失的任务运行。我已将APScheduler配置如下: scheduler.py def configure_scheduler(): jobstores={ 'default':SQLAlchemyJobStore(url=config('DATABASE_url')) } sched=阻塞调度程序() sched.configure(作业存储=作业存储) 计划添加作业( 测试任务, id='te

我正在尝试使用APScheduler测试失败的任务,但在重新启动APScheduler时,没有看到丢失的任务运行。我已将APScheduler配置如下:

scheduler.py

def configure_scheduler():
jobstores={
'default':SQLAlchemyJobStore(url=config('DATABASE_url'))
}
sched=阻塞调度程序()
sched.configure(作业存储=作业存储)
计划添加作业(
测试任务,
id='test_task',
“间隔”,
小时=1,
联合=正确,
最大实例数=1,
失火时间=360,
replace_existing=True
)
返回时间表
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
调度程序=配置调度程序()
scheduler.start()
当我第一次启动调度程序时,
test\u task
将添加到我的Postgres数据库中的
apscheduler\u jobs
表中,从我启动调度程序起,下一次运行时间为一小时。然后,我尝试通过以下方式测试缺火:

  • 将数据库中的下一次运行时间更改为当前时间
  • 等待15秒
  • 启动调度程序
  • 当我执行此过程时,
    下一次运行时间
    再次设置为距当前时间一小时。下一次运行时的
    似乎在SQLAlchemy作业库的方法中更新。我见过一个与失火后不运行的持久作业存储任务相关的例子。我见过的大多数解决方案是将
    misfire\u grace\u time
    参数添加到
    add\u job
    。我在上面的配置中尝试过这个,但在调度程序启动时没有运行错过的作业。我是否遗漏了与
    replace\u现有
    misfire\u grace\u time
    参数如何交互有关的内容?我是否需要手动检查任何作业的
    下一次运行时间
    是否在过去,然后在启动计划程序之前运行这些作业

    我正在使用APScheduler库的v3.6.1

    对于其他上下文,我将在Heroku上部署调度程序,并尝试解决每天至少发生一次的Heroku问题

    在APScheduler Gitter聊天室与Alex Grönholm(APScheduler的创建者)聊天后,我能够确定作业在我的数据库中被“覆盖”,因为我在调用
    添加作业
    时有
    replace_existing=True
    。这会导致计划程序每次启动时都替换jobstore中的作业

    我的解决方法

  • 在计划程序启动之前,请检查
    apscheduler\u作业
    表中的现有作业

  • 对于数据库中的每个作业,请对照当前时间检查
    下一次运行时间
    。如果下一次运行时间是过去的,请立即运行作业

  • 使用
    replace_existing=True
    像以前一样安排作业

  • 启动调度程序


  • 我尝试了Alex Grönholm(APScheduler的创建者)的建议。启动BackgroundScheduler,添加作业并使主程序运行
    ,同时执行True
    循环。我能处理掉那些错失的工作。