APScheduler在Heroku睡觉后不记得工作

时间:2019-07-17 22:00:24

标签: python heroku sqlalchemy apscheduler

我目前正在尝试通过Heroku实现APScheduler。我让调度程序像在Heroku运行时一样通过Python通过Heroku工作。我遇到的问题是Heroku测功机在闲置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进入睡眠状态时调度程序是否拉出未执行的作业。

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

1 个答案:

答案 0 :(得分:0)

您正在使用SQLite数据库存储作业。这在Heroku的ephemeral filesystem上效果不佳,每次您的dyno重新启动时,它都会丢失所有更改。 happens frequently(每天至少一次),很可能在您的应用进入睡眠状态并随后唤醒时发生。

您应该改为使用客户端服务器数据库。 Heroku的Postgres service可能是更好的选择。开箱即用,基本计划是免费的。