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 也会终止

参考

posted @ 2022-01-15 22:30  Hubery_Jun  阅读(2273)  评论(0编辑  收藏  举报