定时校正
- 需求: mysql和redis两个系统, mysql增加数据成功, redis未必添加成功, 这样两个系统的数据可能出现偏差, 所以需要定期对mysql和redis的数据进行同步
- 解决方案: 每天执行一次定时任务, 让mysql数据和redis数据进行同步
- crontab
- 是linux系统一个内置命令, 依赖于linux系统, 无动态管理任务(取消/暂停/修改任务配置)
- 使用场景: 适合于普通的静态任务
- apscheduler
- 独立的定时器程序, 可以方便的管理定时任务
- 使用场景: 需要动态生成/管理任务, 如下单后30分钟可有效期
- 安装
pip install apscheduler
- 支持三种触发器
- date 只执行一次
- interval 周期执行 参数
时间间隔
- cron 周期执行 参数
时间
- date 只执行一次
调度器 Scheduler
负责管理定时任务
BlockingScheduler: 作为独立进程时使用
from apscheduler.schedulers.blocking import BlockingScheduler scheduler = BlockingScheduler() scheduler.start() # 此处程序会发生阻塞
BackgroundScheduler: 在框架程序(如Django、Flask)中使用
from apscheduler.schedulers.background import BackgroundScheduler scheduler = BackgroundScheduler() scheduler.start() # 此处程序不会发生阻塞
执行器 executors
在定时任务该执行时,以进程或线程方式执行任务
ThreadPoolExecutor
from apscheduler.executors.pool import ThreadPoolExecutor ThreadPoolExecutor(max_workers) ThreadPoolExecutor(20) # 最多20个线程同时执行
使用方法
executors = { 'default': ThreadPoolExecutor(20) } scheduler = BackgroundScheduler(executors=executors)
ProcessPoolExecutor
from apscheduler.executors.pool import ProcessPoolExecutor ProcessPoolExecutor(max_workers) ProcessPoolExecutor(5) # 最多5个进程同时执行
使用方法
executors = { 'default': ProcessPoolExecutor(3) } scheduler = BackgroundScheduler(executors=executors)