【python基础】定时任务框架APScheduler
1. 基础概念
APScheduler是python中较为简洁直观的定时任务框架,提供了基于固定日期、时间间隔、crontab表达式三种任务类型,并且可以持久化任务(如:将定时任务保存到mysql中),方便我们去实现一个python定时任务系统。
APScheduler由四个部件组成:
trigger:触发器,每个job都有一个包含触发逻辑的触发器, 触发器类型有三种:
<1> "date": 指定时间的一次性任务
<2> "interval": 有时间间隔的循环任务
<3> "cron": crontab表达式定时任务
jobstores:存储器, 存储被调度的job,默认是保存在内存中,也可以通过SQLAlchemyJobStore持久化到数据库中
executor:执行器, 提交指定的job到进程池或线程池来执行,运行完成通知调度器
<1> ThreadPoolExecutor: 线程池执行器,默认选用线程形式执行,进程比较耗资源
<2> ProcessPoolExecutor: 进程池执行器
scheduler:调度器, 负责job整体的控制调度, 配置指定的job存储器与执行器,也可以增加、删除、修改job
**两种常用调度器的区别:
<1> BlockingScheduler: 当调用start函数后会阻塞当前线程, 后面代码不会被执行
<2> BackgroundScheduler:当调用start函数后后台执行,不会阻塞后续代码的执行
2.示例代码
3.知识点整理
3.1. "interval"和"cron"类型的job均支持设置开始/结束时间参数
*start_date:作为计算周期的开始时间点,其实也明确了下次job触发的时间点
*end_date: job生命周期的终点
3.2. "cron"类型的任务不仅支持按照一个或多个时间域来设置,而且支持使用标准的crontab表达式
*CronTrigger.from_crontab('0/1 15 * * *')
注意:这里的crontab表达式是5位,分别对应的时间域minute, hour, day of month, month, day of week
3.3. 如果job需要传参,args传参必须是个有序的数据类型, 如列表,元组,字符串等,且元素数量和位置 = 入参数量和位置
3.4. scheduler添加/删除job的方法:
添加Job:scheduler.add_job()
@scheduler.scheduled_add() #具体函数的修饰器
删除Job: scheduler.remove('job_id')
3.5. 减少定时任务设定的执行时间重叠,避免线程冲突
3.6. 最好要设定时区timezone = 'Asia/Shanghai' (有点坑,因为个人办公电脑的UTC时区配置可能有偏差)
4. 更多细节 >>> Apscheduler官方文档: https://apscheduler.readthedocs.io/en/3.x/index.html