如何使用 SQLALchemyJobStore 保存 python Apscheduler
How to save python Apscheduler using SQLALchemyJobStore
最近,我正在使用 python
在本地主机服务器上制作个人新闻聚合器。我想每天在特定时间从许多不同的站点自动获取 RSS 提要。我在互联网上搜索了这个,发现有 Apscheduler
图书馆。为了避免每次打开计算机时都创建新的调度程序,我认为最好使用 SQLALchemyJobStore
.
将调度程序保存在我的 Mysql
数据库中
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)
如@Sraw 所述,您无需担心如何加载作业,它会为您完成。您忘记在末尾添加一行
scheduler.start()
只是不要忘记在添加职位时添加 job_store。
scheduler.add_job(jobstore='mongo', trigger='cron', minute=8)
在我的例子中,我只使用
jobstores = {
'mongo': MongoDBJobStore()
}
并在我的 mongo 中创建了 'apscheduler' 数据库,其中包含集合 'jobs'。如果正在加载作业,您可以使用 mongo shell 手动检查。您还可以使用 print_jobs 或 get_jobs() of scheduler
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()
最近,我正在使用 python
在本地主机服务器上制作个人新闻聚合器。我想每天在特定时间从许多不同的站点自动获取 RSS 提要。我在互联网上搜索了这个,发现有 Apscheduler
图书馆。为了避免每次打开计算机时都创建新的调度程序,我认为最好使用 SQLALchemyJobStore
.
Mysql
数据库中
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)
如@Sraw 所述,您无需担心如何加载作业,它会为您完成。您忘记在末尾添加一行
scheduler.start()
只是不要忘记在添加职位时添加 job_store。
scheduler.add_job(jobstore='mongo', trigger='cron', minute=8)
在我的例子中,我只使用
jobstores = {
'mongo': MongoDBJobStore()
}
并在我的 mongo 中创建了 'apscheduler' 数据库,其中包含集合 'jobs'。如果正在加载作业,您可以使用 mongo shell 手动检查。您还可以使用 print_jobs 或 get_jobs() of scheduler
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()