触发器

触发器不是单独定义的,而是在向调度器中添加任务时定义的,其表现为.add_job()方法和@scheduled_job()修饰器的参数。以.add_job()方法为例,添加任务的格式一般为.add_job(任务函数, 触发器类型, 触发器参数, args=任务函数参数)

这其中触发器类型为一个字符串型值,根据APScheduler内建的三种触发器,分别可以取dateintervalcron。以下是三种触发器可以接受的触发器参数及意义。

  • date触发器,被调度任务只会在指定时间执行一次。
    • run_date,datetime类型或者字符串类型,表示任务的运行日期或者时间。
    • timezone,tzinfo类型或者字符串类型,指定时区。
  • interval触发器,被调度任务会按照指定的时间间隔执行。以下参数除start_dateend_date外只需指定一项即可。
    • weeks,间隔周数。
    • days,间隔天数。
    • hours,间隔小时数。
    • minutes,间隔分钟数。
    • seconds,间隔秒数。
    • start_date,开始日期。
    • end_date,结束日期。
    • timezone,指定时区。
  • cron触发器,在特定的时间周期性触发,兼容Linux crontab格式。以下参数除start_dateend_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')

这个示例中已经包含了大部分条件的使用方法,可以在实际项目中参照书写。