天天看点

python定时模块APScheduler

APScheduler

    • 安装
    • 功能
    • 调度器scheduler
      • BlockingScheduler
      • BackgroundScheduler
    • 操作调度器中的任务
    • 定时控制
      • interval 间隔
      • date 定时执行一次
      • cron 定时执行 (类似于linux的crontab)

安装

pip install apscheduler
           

功能

用来执行定时任务

提供两种定时方式,分别是基于固定时间的间隔,和corntab类型的任务。

调度器scheduler

APScheduler的scheduler有多种IO模型,不同的IO模型有不同的使用效果。

  1. BlockingScheduler:main_loop会在当前进程的主线程内运行,调用start函数后会阻塞当前线程。
  2. BackgroundScheduler: main_loop会在当前进程的其他线程中运行,调用start函数不会阻塞当前线程
  3. 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函数
           

参数说明如下

python定时模块APScheduler

引用了别人的代码:

#表示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')