APScheduler
-
- 安装
- 功能
- 调度器scheduler
-
- BlockingScheduler
- BackgroundScheduler
- 操作调度器中的任务
- 定时控制
-
- interval 间隔
- date 定时执行一次
- cron 定时执行 (类似于linux的crontab)
安装
pip install apscheduler
功能
用来执行定时任务
提供两种定时方式,分别是基于固定时间的间隔,和corntab类型的任务。
调度器scheduler
APScheduler的scheduler有多种IO模型,不同的IO模型有不同的使用效果。
- BlockingScheduler:main_loop会在当前进程的主线程内运行,调用start函数后会阻塞当前线程。
- BackgroundScheduler: main_loop会在当前进程的其他线程中运行,调用start函数不会阻塞当前线程
-
QtScheduler:使用QTimer完成定时唤醒
其他几种IO模型,我暂时用不到,日后用到再加吧。
BlockingScheduler
from apscheduler.schedulers.blocking import BlockingScheduler
def job():
print('hello')
scheduler = BlockingScheduler()
scheduler.add_job(job, 'interval', seconds=1)
scheduler.start()
print('ok')
BackgroundScheduler
import time
from apscheduler.schedulers.background import BackgroundScheduler
def job():
print("hello")
scheduler = BackgroundScheduler()
scheduler.add_job(job, 'interval', seconds=1)
scheduler.start()
while(1):
print("ok")
time.sleep(1)
操作调度器中的任务
有了调度器之后,我们需要给调度器添加任务。
有两种添加任务的方法,一种是add_job() 上面举的两个例子都是,另一种是scheduled_job修饰器
from apscheduler.schedulers.blocking import BlockingScheduler
scheduler = BlockingScheduler()
@scheduler.scheduled_job('interval', seconds=1)
def job():
print('hello')
scheduler.start()
删除调度器中的任务
可以在添加任务时,设置一个任务id,通过id删除任务
scheduler.add_job(job, 'interval', seconds=1, id='my_job_id')
scheduler.remove_job('my_job_id')
或者
test = scheduler.add_job(job, 'interval', seconds=1)
test.remove()
得到调度器中的任务
scheduler.get_job(job_id="my_job_id") #得到任务id为my_job_id的任务
scheduler.get_jobs() #得到所有任务
返回结果是job的实例
暂停与恢复任务
暂停(重置运行时间,且暂停时不会计入时间)
scheduler.job.Job.pause()
scheduler.schedulers.base.BaseScheduler.pause_job()
恢复
scheduler.job.Job.resume()
scheduler.schedulers.base.BaseScheduler.resume_job()
关闭调度器
scheduler.shutdown() #默认情况,当所有任务完成后,关闭调度器和任务存储
scheduler.shutdown(wait=False) #不会等待所有任务结束
定时控制
interval 间隔
scheduler.add_job(job, 'interval', seconds=1)
表示间隔一秒,调用一次job函数。
scheduler.add_job(job, 'interval', days=1, hours=11, minutes=12, seconds=1)
表示每隔1天11小时12分钟1秒,调用一次job函数
date 定时执行一次
scheduler.add_job(job, 'date',run_date="2019-03-29 20:00:00")
这里可以用datetime模块,更容易书写
scheduler.add_job(job, 'date',run_date=datetime.datetime(2019,3,29,20,0,0))
scheduler.add_job(job, 'date',run_date=datetime.date(2019,3,29))
用date模式有个奇怪的地方,进程会卡死,只能用kill命令杀死进程,应该是使用了多线程引起的。
cron 定时执行 (类似于linux的crontab)
scheduler.add_job(job, 'cron', hour='10', minute='30', second='30') #表示每天10:30:30执行一次job函数
参数说明如下
引用了别人的代码:
#表示2017年3月22日17时19分07秒执行该程序
sched.add_job(my_job, 'cron', year=2017,month = 03,day = 22,hour = 17,minute = 19,second = 07)
#表示任务在6,7,8,11,12月份的第三个星期五的00:00,01:00,02:00,03:00 执行该程序
sched.add_job(my_job, 'cron', month='6-8,11-12', day='3rd fri', hour='0-3')
#表示从星期一到星期五5:30(AM)直到2014-05-30 00:00:00
sched.add_job(my_job(), 'cron', day_of_week='mon-fri', hour=5, minute=30,end_date='2014-05-30')
#表示每5秒执行该程序一次,相当于interval 间隔调度中seconds = 5
sched.add_job(my_job, 'cron',second = '*/5')