1、导读
环境:Windows 11、python 3.12.3、Django 4.2.11、 APScheduler 3.10.4
背景:工作出现bug,需要监控事件的发生,此处使用APScheduler提供的add_listener方式
事件:20240911
说明:记录,方便后期自己查找
2、实现方法
from pytz import utc, timezone
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_ALL
from django_apscheduler.jobstores import DjangoJobStore
def my_listener(event):
"""调度事件监听"""
print(event.code, "----------------------------------------------------")
# 配置执行器,并设置线程数
executors = {
'default': ThreadPoolExecutor(20),
'processpool': ProcessPoolExecutor(5)
}
job_defaults = {
'coalesce': False, # 默认情况下关闭新的作业
'max_instances': 3 # 设置调度程序将同时运行的特定作业的最大实例数3
}
scheduler = BackgroundScheduler(executors=executors, job_defaults=job_defaults, timezone=timezone('Asia/Shanghai'))
scheduler.add_jobstore(DjangoJobStore(), "default")
scheduler.add_listener(my_listener, EVENT_ALL)
scheduler.start()
3、流程说明
APScheduler的事件监控指的是,当该事件发生时,会触发相应的动作(你指定的函数)。上面使用的是EVENT_ALL这个参数,即:所有能触发的动作,均会调用my_listener函数,比如附录中的启动调度器、关闭调度器、添加job、添加jobstore等所有动作。附录中的动作摘自源码,理论上而言,就是APScheduler支持的所有事件了。我们可以通过event的code属性获取代码的值,比如获取的是1,则表明执行的scheduler启动的操作。如果你仅需要监控添加任务的动作,示例中的EVENT_ALL换为EVENT_JOB_ADDED即可。
4、附录
常量名称 | 代码 | 触发说明 | 触发条件 |
---|---|---|---|
EVENT_SCHEDULER_STARTED | 1 | 调度程序启动 | scheduler.start() |
EVENT_SCHEDULER_SHUTDOWN | 2 | 调度程序关闭 | scheduler.shutdown() |
EVENT_SCHEDULER_PAUSED | 4 | 调度程序暂停 | scheduler.pause() |
EVENT_SCHEDULER_RESUMED | 8 | 调度程序恢复 | scheduler.resume() |
EVENT_EXECUTOR_ADDED | 16 | 调度程序添加执行器 | scheduler.add_executor() |
EVENT_EXECUTOR_REMOVED | 32 | 调度程序删除执行器 | scheduler.remove_executor() |
EVENT_JOBSTORE_ADDED | 64 | 调度程序添加作业存储器 | scheduler.add_jobstore() |
EVENT_JOBSTORE_REMOVED | 128 | 调度程序删除作业存储器 | scheduler.remove_jobstore() |
EVENT_ALL_JOBS_REMOVED | 256 | 删除所有job | scheduler.remove_all_jobs() |
EVENT_JOB_ADDED | 512 | 添加job | scheduler.add_job() |
EVENT_JOB_REMOVED | 1024 | 删除job | scheduler.remove_job() |
EVENT_JOB_MODIFIED | 2048 | 暂停、恢复、修改job | scheduler.pause_job() scheduler.resume_job() scheduler.modify_job() |
EVENT_JOB_EXECUTED | 4096 | job成功执行 | 任务执行成功后,自动触发 |
EVENT_JOB_ERROR | 8192 | job执行出现错误 | 任务执行出现异常,自动触发 |
EVENT_JOB_MISSED | 16384 | job执行丢失 | 错过执行时间,比如:add_job的时候,执行时间为过去的时间,即可触发该条件 |
EVENT_JOB_SUBMITTED | 32768 | job提交 | 未测试 |
EVENT_JOB_MAX_INSTANCES | 65536 | 超过最大实例未执行 | 未测试 |
EVENT_ALL | 以上所有 | 以上所有 | |