Python APScheduler任务调度框架简介

使用背景:

为了让自己可以更好地偷懒,(哦不,是为了工作更加高效、便捷)以及对每天去执行一次脚本的厌倦,从而让自己接触了APScheduler模块,果然是偷懒必备的神器。


简介:

APScheduler是一个 Python 定时任务框架(第三方库,用来提供python的后台程序),使用起来十分方便。提供了基于日期、固定时间间隔以及 crontab 类型的任务,并且可以持久化任务、并以 daemon 方式运行应用。

安装:

pip简易安装

1
pip install apscheduler

组件

a. 触发器(trigger):
包含调度逻辑,每一个作业有它自己的触发器,用于决定接下来哪一个作业会运行。
b. 作业存储(job store):
存储被调度的作业,默认的作业存储是简单地把作业保存在内存中,其他的作业存储是将作业保存在数据库中。
c. 执行器(executor):
处理作业的运行,他们通常通过在作业中提交制定的可调用对象到一个线程或者进城池来进行。当作业完成时,执行器将会通知调度器。
d. 调度器(scheduler):
是其他的组成部分。你通常在应用只有一个调度器,应用的开发者通常不会直接处理作业存储、调度器和触发器,相反,调度器提供了处理这些的合适的接口。配置作业存储和执行器可以在调度器中完成,例如添加、修改和移除作业。

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# _*_ coding:utf-8 _*_
import os
import time
from apscheduer.schedulers.blocking import BlockingScheduler

# add my_job
def my_job():
os.system('python download_xxx_xxx.py')
print 'download_xxx_xxx.py is downloading, waiting for 5 seconds...'
time.sleep(5)
os.system('python onekey.py')
scheduler = BlockingScheduler() # setting scheduler
scheduler.add_job(my_job, 'cron', day_of_week='0-6', hour='9', minute='30') # job store
scheduler.start()

看码解读

  1. BlockingScheduler ———- 是APScheduler中的常用调度器之一
    $ BlockingScheduler(当调度器是应用中唯一要运行的任务时)
    $ BackgroundScheduler(如果希望调度器在后台执行,使用 BackgroundScheduler)
  2. add_job() ———- 添加作业,即添加你自己设定需要执行的功能函数
  3. my_job ———- 作业
  4. ‘cron’ ———- trigger触发器,有三种模式:cron(定时调度)、interval(间隔调度)、date(定时调度)

三种调度(trigger触发方式)

cron 定时调度:
———— year: 4位数字
———— month: 月 (1-12)
———— day: 天 (1-31)
———— week: 标准周 (1-53)
———— day_of_week: 周中某天 (0-6 or mon,tue,wed,thu,fri,sat,sun)
———— hour: 小时 (0-23)
———— minute:分钟 (0-59)
———— second: 秒 (0-59)
———— start_date: 最早执行时间
———— end_date: 最晚执行时间
———— timezone: 执行时间区间

1
2
3
4
5
6
sched.add_job(my_job, 'cron', hour=3, minute=30)
sched.add_job(my_job, 'cron', day_of_week='mon-fri', hour=5, minute=30, end_date='2017-10-30')

@sched.scheduled_job('cron', id='my_job_id', day='last sun')
def some_decorated_task():
print("I am printed at 00:00:00 on the last Sunday of every month!")

interval 间隔调度:
———— weeks: 每隔几周执行一次 | weeks=0
———— days: 每隔几天执行一次 | days=0
———— hours: 每隔几小时执行一次 | hours=0
———— minutes: 每隔几分执行一次 | minutes=0
———— seconds: 每隔几秒执行一次 | seconds=0
———— start_date: 最早执行时间 start_date=None
———— end_date: 最晚执行时间 end_date=None
———— timezone: 执行时间区间 timezone=None

1
2
3
4
5
6
scheduler.add_job(my_job, 'interval', hours=2)
scheduler.add_job(my_job, 'interval', hours=2, start_date='2017-9-8 21:30:00', end_date='2018-06-15 21:30:00)

@scheduler.scheduled_job('interval', id='my_job_id', hours=2)
def my_job():
print("Hello World")

date 定时调度——–run_date(datetime|str)
———— 最基本的一种调度,作业只会执行一次。
———— run_date: 在某天执行任务
———— timezone: 在某段时间执行任务

1
2
3
4
5
scheduler.add_job(my_job, 'date', run_date=date(2017, 9, 8), args=[])
scheduler.add_job(my_job, 'date', run_date=datetime(2017, 9, 8, 21, 30, 5), args=[])
scheduler.add_job(my_job, 'date', run_date='2017-9-08 21:30:05', args=[])
# The 'date' trigger and datetime.now() as run_date are implicit
sched.add_job(my_job, args=[[])

job(作业操作)

1)添加作业:
使用add_job(): scheduler.add_job(myfunc, ‘interval’, minutes=2)
2)使用装饰器:
@sched.scheduled_job(‘cron’, id=’my_job_id’, day=’last sun’)
add_job的第二个参数是trigger,它管理着作业的调度方式。它可以为date, interval或者cron。对于不同的trigger,对应的参数也相同。
3)移除作业:
scheduler.remove_job(‘my_job_id’)
4)暂停和继续作业:
apscheduler.schedulers.base.BaseScheduler.pause_job() apscheduler.schedulers.base.BaseScheduler.resume_job()
5)获得job列表:
scheduler.get_jobs()
6)关闭调度器:
scheduler.shutdown(wait=False) 默认情况下调度器会等待所有正在运行的作业完成后,关闭所有的调度器和作业存储。如果你不想等待,可以将wait选项设置为False。

参考:

http://pypi.python.org/pyg/APScheduler/
http://shanyj.github.io/2015/07/03/APScheduler/
https://lz5z.com/Python%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E7%9A%84%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F/



sign bman

-------------本文结束感谢浏览-------------