APScheduler 在 Heroku 休眠后不记得工作

APScheduler not remembering jobs after Heroku sleeps

我目前正在尝试通过 Heroku 实现 APScheduler。当 Heroku 为 运行 时,我让调度程序使用 Python 通过 Heroku 工作。我 运行 遇到的问题是 Heroku dyno 在 30 分钟不活动后进入睡眠状态。我希望能够让 Heroku 再次处于活动状态,并让调度程序记住所有在它进入睡眠状态之前未触发的作业。我正在使用 SQLAlchemyJobStore,它应该在调度程序关闭后记住作业。

这是我目前使用的代码:

from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore

jobstores = {
    'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')
}
job_defaults = {
    'coalesce': False,
    'max_instances': 1
}

sched = BlockingScheduler()
sched.configure(jobstores=jobstores, job_defaults=job_defaults, timezone='America/New_York')

def my_job(text):
    print(text)

def add_jobs():
    print("scheduling")
    sched.add_job(my_job, 'date', run_date='2019-7-17 15:25:00', args=['date job firing'], id = "Job1", misfire_grace_time = 18000)
    sched.add_job(my_job, 'date', run_date='2019-7-17 15:30:00', args=['date to run'], id = "Job2", misfire_grace_time=18000)
    sched.add_job(my_job, 'date', run_date='2019-7-17 16:30:00', args=['job after shutdown'], id = 'Job3', misfire_grace_time = 18000)

if __name__ == '__main__':
    add_jobs()
    #sched.print_jobs()
    sched.start()

在这种情况下,我将代码提交并推送到 heroku,它在 heroku 中运行这个文件。我得到的结果如下:

2019-07-17T19:24:38.000000+00:00 app[api]: Build started by user
2019-07-17T19:25:03.445241+00:00 heroku[clock.1]: State changed from down to starting
2019-07-17T19:25:03.227462+00:00 app[api]: Release v268 created by user 
2019-07-17T19:25:03.227462+00:00 app[api]: Deploy 6d599479 by user
2019-07-17T19:25:09.364735+00:00 heroku[clock.1]: Starting process with command `python clock.py`
2019-07-17T19:25:10.118949+00:00 heroku[clock.1]: State changed from starting to up
2019-07-17T19:25:13.928223+00:00 app[clock.1]: scheduling
2019-07-17T19:25:14.142912+00:00 app[clock.1]: date job firing
2019-07-17T19:25:14.000000+00:00 app[api]: Build succeeded
2019-07-17T19:30:00.051064+00:00 app[clock.1]: date to run

前一个作业触发 30 分钟后,Heroku 休眠。这是当我 ping Heroku 唤醒然后 16:30:00 的最后一个作业没有在它应该触发的时候触发。

我认为问题可能与数据库有关。我不确定在任何特定时间数据库中有什么,或者每次 Heroku 进入睡眠状态时调度程序是否正在提取未执行的作业。

如果有人知道为什么会这样,那将非常有帮助。

您正在使用 SQLite 数据库来存储您的作业。这在 Heroku 的 ephemeral filesystem, which loses all changes every time your dyno restarts. This happens frequently 中表现不佳(每天至少一次),并且可能在您的应用休眠然后再次唤醒时发生。

您应该改用 client-server 数据库。 Heroku 的 Postgres service 可能是更好的选择。它开箱即用,基本计划是免费的。