APScheduler BackgroundScheduler 踩坑
前提:使用 MySQL
作为存储器
import time
from datetime import date, datetime
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.schedulers.blocking import BlockingScheduler
from pytz import utc
# 调度器配置方式一
# scheduler = BackgroundScheduler({
# 'apscheduler.jobstores.default': {
# 'type': 'sqlalchemy',
# 'url': 'mysql+pymysql://root:root@127.0.0.1:3306/test_apscheduler?charset=utf8',
# 'tablename': 'api_job'
# },
# 'apscheduler.executors.default': {
# 'class': 'apscheduler.executors.pool:ThreadPoolExecutor',
# 'max_workers': '20'
# },
# 'apscheduler.executors.processpool': {
# 'type': 'processpool',
# 'max_workers': '10'
# },
# 'apscheduler.job_defaults.coalesce': 'false',
# 'apscheduler.job_defaults.max_instances': '10',
# 'apscheduler.timezone': 'UTC',
# })
# 调度器配置方式二
# 作业存储器
jobstores = {
'default': SQLAlchemyJobStore(url='mysql+pymysql://root:root@127.0.0.1:3306/test_apscheduler?charset=utf8')
}
# 执行器
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)
def my_listener(event):
"""调度事件监听"""
if event.exception:
print('The job crashed :(')
else:
print('The job worked :)')
def my_job():
print('当前时间:', datetime.now())
# replace_existing表示如果有重名的任务,直接覆盖
# 其中id表示任务的唯一标识符,coalesce表示忽略服务器宕机时间段内的任务执行(否则就会出现服务器恢复之后一下子执行多次任务的情况)
scheduler.add_job(my_job, 'interval', seconds=3, id="135", coalesce=True, replace_existing=True)
scheduler.add_listener(my_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR)
scheduler.start()
while True:
time.sleep(15)
注意:
BackgroundScheduler
运行在Backgroud
,但是并不会阻止主程序自己终止,而主程序终止后,BackgroundScheduler
也会终止。
参考