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 可能是更好的选择。它开箱即用,基本计划是免费的。
我目前正在尝试通过 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 可能是更好的选择。它开箱即用,基本计划是免费的。