APScheduler
# 介绍
APScheduler可根据指定的时间规则执行指定的任务。可以是间隔多久执行,可以是指定日期时间的执行,也可以类似Linux系统中Crontab中的方式执行任务。
指定的任务即Python函数。
# 调度系统
APScheduler一共有三种调度系统。
Linux中cron风格的调度系统,并有可选的开始和结束时间。
基于时间间隔的调度系统,周期性地执行job,并有可选的开始和结束时间。
只执行一次的延后调度系统,只执行一次作业,在设定的时间执行。
# 组件
# 触发器(triggers)
描述调度任务被触发的条件,也就是定时任务的执行的时机。
# 作业存储(job stores)
Job任务默认存储在内存中,但也可以将任务通过序列化存储到各种数据库中。
# 存储在redis中
from apscheduler.jobstores.redis import RedisJobStore
# 存储在数据库中
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
1
2
3
4
5
2
3
4
5
# 执行器(executors)
负责处理作业的运行,它们通常会将作业提交到到一个线程池或者进程池中进行。当作业完成时,执行器将会通知调度器,随后由调度器发出一个恰当的事件。
最常用的executor:ProcessPoolExecutor、ThreadPoolExecutor。
# 调度器(schedulers)
调度器提供了处理上述东西的接口,通常一个程序中只有一个调度器。程序开发者一般不会直接处理作业存储、执行器和触发器,而是使用调度器。
配置作业存储和执行器可以在调度器中完成,例如添加、修改和移除作业。
# 常用调度器:BlockingScheduler、BackgroundScheduler
# 阻塞运行,调度器在当前进程的主线程中运行
from apscheduler.schedulers.background import BlockingScheduler
# 非阻塞运行,调度器在子线程中运行
from apscheduler.schedulers.background import BackgroundScheduler
1
2
3
4
5
6
7
2
3
4
5
6
7
# 使用方法
# 1.安装模块
pip install APScheduler==3.11.0
1
# 2.创建调度器
from apscheduler.schedulers.background import BlockingScheduler
sched = BlockingScheduler()
1
2
3
2
3
# 3.添加任务
job = sched.add_job(函数对象, '触发方式', 触发参数..., args=[函数参数])
函数对象:即要作为任务执行的函数。
触发方式
- date:在某个确定的时间点执行Job。
- interval:以固定的时间间隔周期性地执行Job。
- cron:在某些固定时间点周期性地执行Job。
触发参数
触发方式为date时。
# run_date='指定执行时间',例如: sched.add_job(my_job, 'date', run_date='2009-11-06 16:30:05') # run_date=时间对象,例如: sched.add_job(my_job, 'date', run_date=datetime(2009, 11, 6, 16, 30, 5))1
2
3
4
5
6触发方式为interval时。
# weeks=间隔礼拜数
# days=间隔天数
# hours=间隔小时数
# minutes=间隔分钟数
# seconds=间隔秒数
# start_date=开启触发的日期时间
# end_date=结束触发的日期时间
# 例如:
sched.add_job(my_job, 'interval', hours=1)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
- 触发方式为cron时。
# 可以书写Cron表达式,不过需要创建CronTrigger对象。
from apscheduler.triggers.cron import CronTrigger
sched.add_job(my_job, CronTrigger.from_crontab('0 0 1-15 may-aug *'))
# 也可以使用Cron参数方式,该方式也支持指定区间。
# second=秒(0-59)
# minute=分钟(0-59)
# hour=小时(0-23)
# day=天(1-31)
# month=月(1-12)
# day_of_week=星期几(0-6)
# year=年份(4位数)
# start_date=开启触发的日期时间
# end_date=结束触发的日期时间
# timezone=时区
sched.add_job(job_function, 'cron', month='6-8,11-12', day='3rd fri', hour='0-3')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 4.启动Scheduler
# 调用start()即可启动scheduler。
sched.start()
1
2
2
# 5.移除任务
# 从scheduler中移除一个job时,它会从关联的job stores中被移除,不再被执行。
# 第一种方式:通过调用remove_job()方法指定job的ID或job store的别名来移除。
# 需要在创建job时指定id,例如:
sched.add_job(myfunc, 'interval', minutes=2, id='my_job_id')
sched.remove_job('my_job_id')
# 第二种方式:对add_job()中得到的job实例调用remove()方法来移除,例如:
my_job = scheduler.add_job(myfunc, 'interval', minutes=2)
my_job.remove()
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 6.获取Job调度列表
# 格式化输出作业列表以及它们的触发器和下一次的运行时间。
sched.print_jobs()
1
2
2
# 7.暂停或恢复Job
# 暂停一个Job,调用job对象的pause()方法即可。
my_job.pause()
# 恢复一个Job,调用job对象的resume()方法即可。
my_job.resume()
1
2
3
4
5
2
3
4
5
# 8.修改Job
# 注意job的id是无法被修改的。
# 调用job对象的modify()方法即可,例如:
my_job.modify(max_instances=6, name='Alternate name')
1
2
3
2
3