如何使用SQLALchemyJobStore保存python Apscheduler

时间:2018-02-02 06:23:03

标签: python mysql apscheduler

最近,我正在使用python在localhost服务器上制作个人新闻聚合器。我希望每天在特定时间从许多不同的站点自动获取RSS源。我在互联网上搜索了这个,我发现有Apscheduler库。为避免每次打开计算机时都创建新的调度程序,我认为最好使用Mysql将调度程序保存在SQLALchemyJobStore数据库中。

here有很多与创建调度程序和配置相关的信息,但我找不到有关存储和加载的任何提及。假设下面的代码是我想要创建的调度程序,我如何在数据库中保存和加载scheduler变量?

from pytz import utc

from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.jobstores.mongodb import MongoDBJobStore
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor


jobstores = {
    'mongo': MongoDBJobStore(),
    'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')
}
executors = {
    'default': ThreadPoolExecutor(20),
    'processpool': ProcessPoolExecutor(5)
}
job_defaults = {
    'coalesce': False,
    'max_instances': 3
}
scheduler = BackgroundScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)

1 个答案:

答案 0 :(得分:0)

正如@Sraw所提到的,你不必担心如何加载它会为你做的工作。你忘了在最后添加一行

scheduler.start()

添加作业时,不要忘记添加job_store。

scheduler.add_job(jobstore='mongo', trigger='cron', minute=8)

就我而言,我只是使用

jobstores = {
    'mongo': MongoDBJobStore()
}

它创造了一个' apscheduler'我的mongo中的数据库有收集' jobs'。如果正在加载作业,您可以使用mongo shell手动检查。您还可以使用调度程序的print_jobs或get_jobs()

scheduler.print_jobs(jobstore='mongo') #mongo in case only
jobs = scheduler.get_jobs(jobstore='mongo') #mongo in my case only

最终您的代码看起来像

from pytz import utc

from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.jobstores.mongodb import MongoDBJobStore
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor


jobstores = {
  'mongo': MongoDBJobStore(),
  'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')
}
executors = {
  'default': ThreadPoolExecutor(20),
  'processpool': ProcessPoolExecutor(5)
}
job_defaults = {
  'coalesce': False,
  'max_instances': 3
}
scheduler = BackgroundScheduler(jobstores=jobstores, 
executors=executors, job_defaults=job_defaults, timezone=utc)
scheduler.start()