作者:lizhonglin
github: https://github.com/Leezhonglin/
blog: https://leezhonglin.github.io/
APScheduler是一个Python库,可让您安排稍后执行的Python代码,是一套任务调度框架,可以用来做定时任务控制器,可以添加删除任务。如果将作业存储在数据库中,它们也将在调度程序重新启动后继续运行并保持其状态。重新启动调度程序后,它将运行它应该在脱机时运行的所有作业。
除此之外,APScheduler还可以用作特定于平台的调度程序(如cron守护程序或Windows任务调度程序)的跨平台,特定于应用程序的替代程序。但请注意,APScheduler本身不是守护程序或服务,也不附带任何命令行工具。它主要用于在现有应用程序中运行。也就是说,APScheduler确实为您提供了一些构建块来构建调度程序服务或运行专用的调度程序进程。
APScheduler有三个可以使用的内置调度系统:
APScheduler
是一个python的第三方库,用来提供python的后台程序。包含四个组件,分别是:
具体内容如下:
triggers: 支持三种任务触发方式
date:固定日期触发器,任务只运行一次,运行完毕自动清除;若错过指定运行时间,任务不会被创建
参数 | 说明 |
---|---|
run_date (datetime 或 str) | 作业的运行日期或时间 |
timezone (datetime.tzinfo 或 str) | 指定时区 |
例如# 在 2019-4-24 00:00:01 时刻运行一次 start_system 方法
scheduler .add_job(start_system, 'date', run_date='2019-4-24 00:00:01', args=['text'])
interval:时间间隔触发器,每个一定时间间隔执行一次。
参数 | 说明 |
---|---|
weeks (int) | 间隔几周 |
days (int) | 间隔几天 |
hours (int) | 间隔几小时 |
minutes (int) | 间隔几分钟 |
seconds (int) | 间隔多少秒 |
start_date (datetime 或 str) | 开始日期 |
end_date (datetime 或 str) | 结束日期 |
# 在 2019-4-24 00:00:00 - 2019-4-24 08:00:00 之间, 每隔两小时执行一次 alarm_job 方法
scheduler .add_job(alarm_job, 'interval', hours=2, start_date='2019-4-24 00:00:00' , end_date='2019-4-24 08:00:00')
cron:cron风格的任务触发
参数 | 说明 |
---|---|
year (int 或 str) | 表示四位数的年份 (2019) |
month(int|str) | 月 (范围1-12) |
day(int|str) | 日 (范围1-31) |
week(int|str) | 周 (范围1-53) |
day_of_week (int|str) | 表示一周中的第几天,既可以用0-6表示也可以用其英语缩写表示 |
hour (int|str) | 表示取值范围为0-23时 |
minute (int|str) | 表示取值范围为0-59分 |
second (int|str) | 表示取值范围为0-59秒 |
start_date (datetime|str) | 表示开始时间 |
end_date (datetime|str) | 表示结束时间 |
timezone (datetime.tzinfo|str) | 表示时区取值 |
(
int
|str
) 表示参数既可以是int
类型,也可以是str
类型
(datetime |str
) 表示参数既可以是datetime类型,也可以是str
类型
例如:表示每5秒执行该程序一次,相当于interval 间隔调度中seconds = 5
sched.add_job(my_job, 'cron',second = '*/5')
job stores: 支持四种任务存储方式
schedulers: 调度器主要分三种,一种独立运行的,一种是后台运行的,最后一种是配合其它程序使用
唯一要运行
的东西时使用不运行其它框架
的时候使用,并使你的任务在 后台运行
异步IO模型
的时候使用gevent
框架配套使用tornado
框架配套使用Twisted
框架配套使用qt
应用的时候使用pip install Flask-APScheduler
首先在flask的create_app函数中创建最初的调度器
from apscheduler.triggers.interval import IntervalTrigger
###此方法负责初始化app
def create_app(config_name):
app=Flask(__name__)
CORS(app)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
###初始化数据库
db.init_app(app)
#####################################################上面代码忽略
# 这里是重点
# 初始化备份数据库定时器
scheduler.init_app(app)
# # 解决FLASK DEBUG模式定时任务执行两次
if os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
scheduler.api_enabled = True
scheduler.init_app(app)
# 实例话interval对象,如果不实例话的话有可能会报错没有interval这个
interval = IntervalTrigger(
days = 2,
start_date='2019-4-24 08:00:00',
end_date='2099-4-24 08:00:00',
timezone='Asia/Shanghai')
# dbDump 是一个备份数据库的函数,这个根据自己的实际情况来看
scheduler.add_job(func=dbDump,trigger=interval,id='bak_one')
scheduler.start()
######################################################下面代码忽略
###初始化上传下载和导出目录
# init_static_path()
###注册蓝图
register_app(app)
# ###初始化日志
init_log()
return app
如果需要重新替换上面的任务可以在任务中多添加一个参数replace_existing=True
由上面的两天备份一次 变成每天备份一次。配置成功后他会自动去替换上面的定时器。
# 判断配置文件变化 更新定时任务
if os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
interval = IntervalTrigger(
days=1,
start_date='2019-4-24 08:00:00',
end_date='2099-4-24 08:00:00',
timezone='Asia/Shanghai')
scheduler.add_job(
func=dbDump,
trigger=interval,
id='bak_one',
replace_existing=True)
replace_existing=True 这个参数非常重要,在这个地方弄了很久,开始一直不能替换第一次任务。
问题解决:
scheduler.add_job(dbDump,'interval',id='bak_one',days=1,start_date='2019-4-24 08:00:00',end_date='2099-4-24 08:00:00',replace_existing=True)
如果是按照上面创建的任务的话在使用pyinstaller打包生成的可执行文件,运行的时候会出现如下面的问题
APScheduler: LookupError: No trigger by the name “interval” was found
解决方案是:替换成我上面的方式去创建任务就可以解决的。