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

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风老魔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值