Python 实现定时任务的八种方案( 三 )

利用任务框架APScheduler实现定时任务APScheduler(advanceded python scheduler)基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便 。提供了基于日期、固定时间间隔以及crontab类型的任务,并且可以持久化任务 。基于这些功能,我们可以很方便的实现一个Python定时任务系统 。
它有以下三个特点:

  • 类似于 Liunx Cron 的调度程序(可选的开始/结束时间)
  • 基于时间间隔的执行调度(周期性调度,可选的开始/结束时间)
  • 一次性执行任务(在设定的日期/时间运行一次任务)
APScheduler有四种组成部分:
  • 触发器(trigger) 包含调度逻辑,每一个作业有它自己的触发器,用于决定接下来哪一个作业会运行 。除了他们自己初始配置意外,触发器完全是无状态的 。
  • 作业存储(job store) 存储被调度的作业,默认的作业存储是简单地把作业保存在内存中,其他的作业存储是将作业保存在数据库中 。一个作业的数据讲在保存在持久化作业存储时被序列化,并在加载时被反序列化 。调度器不能分享同一个作业存储 。
  • 执行器(executor) 处理作业的运行,他们通常通过在作业中提交制定的可调用对象到一个线程或者进城池来进行 。当作业完成时,执行器将会通知调度器 。
  • 调度器(scheduler) 是其他的组成部分 。你通常在应用只有一个调度器,应用的开发者通常不会直接处理作业存储、调度器和触发器,相反,调度器提供了处理这些的合适的接口 。配置作业存储和执行器可以在调度器中完成,例如添加、修改和移除作业 。通过配置executor、jobstore、trigger,使用线程池(ThreadPoolExecutor默认值20)或进程池(ProcessPoolExecutor 默认值5)并且默认最多3个(max_instances)任务实例同时运行,实现对job的增删改查等调度控制

Python 实现定时任务的八种方案

文章插图
 
示例代码:
from apscheduler.schedulers.blocking import BlockingSchedulerfrom datetime import datetime# 输出时间def job():print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))# BlockingSchedulersched = BlockingScheduler()sched.add_job(my_job, 'interval', seconds=5, id='my_job_id')sched.start()APScheduler中的重要概念Job 作业Job作为APScheduler最小执行单位 。创建Job时指定执行的函数,函数中所需参数,Job执行时的一些设置信息 。
构建说明:
  • id:指定作业的唯一ID
  • name:指定作业的名字
  • trigger:apscheduler定义的触发器,用于确定Job的执行时间,根据设置的trigger规则,计算得到下次执行此job的时间,满足时将会执行
  • executor:apscheduler定义的执行器,job创建时设置执行器的名字,根据字符串你名字到scheduler获取到执行此job的 执行器,执行job指定的函数
  • max_instances:执行此job的最大实例数,executor执行job时,根据job的id来计算执行次数,根据设置的最大实例数来确定是否可执行
  • next_run_time:Job下次的执行时间,创建Job时可以指定一个时间[datetime],不指定的话则默认根据trigger获取触发时间
  • misfire_grace_time:Job的延迟执行时间,例如Job的计划执行时间是21:00:00,但因服务重启或其他原因导致21:00:31才执行,如果设置此key为40,则该job会继续执行,否则将会丢弃此job
  • coalesce:Job是否合并执行,是一个bool值 。例如scheduler停止20s后重启启动,而job的触发器设置为5s执行一次,因此此job错过了4个执行时间,如果设置为是,则会合并到一次执行,否则会逐个执行
  • func:Job执行的函数
  • args:Job执行函数需要的位置参数
  • kwargs:Job执行函数需要的关键字参数
Trigger 触发器Trigger绑定到Job,在scheduler调度筛选Job时,根据触发器的规则计算出Job的触发时间,然后与当前时间比较确定此Job是否会被执行,总之就是根据trigger规则计算出下一个执行时间 。
目前APScheduler支持触发器:
  • 指定时间的DateTrigger
  • 指定间隔时间的IntervalTrigger
  • 像Linux的crontab一样的CronTrigger 。
触发器参数:date
date定时,作业只执行一次 。
  • run_date (datetime|str) – the date/time to run the job at
  • timezone (datetime.tzinfo|str) – time zone for run_date if it doesn’t have one already
sched.add_job(my_job, 'date', run_date=date(2009, 11, 6), args=['text'])sched.add_job(my_job, 'date', run_date=datetime(2019, 7, 6, 16, 30, 5), args=['text'])


推荐阅读