触发器
触发器不是单独定义的,而是在向调度器中添加任务时定义的,其表现为.add_job()
方法和@scheduled_job()
修饰器的参数。以.add_job()
方法为例,添加任务的格式一般为.add_job(任务函数, 触发器类型, 触发器参数, args=任务函数参数)
。
这其中触发器类型为一个字符串型值,根据APScheduler内建的三种触发器,分别可以取date
、interval
和cron
。以下是三种触发器可以接受的触发器参数及意义。
date
触发器,被调度任务只会在指定时间执行一次。run_date
,datetime类型或者字符串类型,表示任务的运行日期或者时间。timezone
,tzinfo类型或者字符串类型,指定时区。
interval
触发器,被调度任务会按照指定的时间间隔执行。以下参数除start_date
和end_date
外只需指定一项即可。weeks
,间隔周数。days
,间隔天数。hours
,间隔小时数。minutes
,间隔分钟数。seconds
,间隔秒数。start_date
,开始日期。end_date
,结束日期。timezone
,指定时区。
cron
触发器,在特定的时间周期性触发,兼容Linux crontab格式。以下参数除start_date
和end_date
外可以使用多项,并且可以使用后面介绍的算术表达式来定义触发周期。year
,年。month
,月。day
,日。week
,周。day_of_week
,周内第几天。hour
,时。minute
,分。second
,秒。start_date
,开始日期。end_date
,结束日期。timezone
,指定时区。
当使用cron
触发器时,其每一项参数都用来指定周期的触发条件。之所以称其为最强大的触发器,可以参考以下算术表达式表来体会。
表达式 | 可用于参数 | 功能 |
---|---|---|
* | 所有 | 每一个单位的值都触发 |
*/a | 所有 | 每a个单位的值都触发 |
a-b | 所有 | 在a到b之间的值都触发 |
a-b/c | 所有 | 在a到b之间每c个单位的值都触发 |
nth y | 日 | 在每个月中第n次出现的一周中第y天触发 |
last y | 日 | 在每个月中最后一次出现的一周中第y天触发 |
last | 日 | 在每个月的最后一天触发 |
x,y,z | 所有 | 联合条件,符合任何一项条件即触发,可以使用以上所有条件定义 |
以下给出一个使用cron
定义任务触发条件的示例。
# 指定任务func会在每年1到3月、7到9月的每个周一、周二每隔三个小时执行一次
scheduler.add_job(func, 'cron', month='1-3,7-9', day='0, true', hour='*/3')
这个示例中已经包含了大部分条件的使用方法,可以在实际项目中参照书写。