一.apscheduler简介
Advanced Python Scheduler(APScheduler)是一个Python库,可让您安排Python代码稍后执行,一次或定期执行。您可以根据需要随时添加或删除旧作业。如果将作业存储在数据库中,它们还将在调度程序重新启动并保持其状态的过程中幸免。重新启动调度程序后,它将运行它在脱机时应已运行的所有任务。
除其他事项外,APScheduler可用作跨平台的,特定于应用程序的替代程序,以替换平台特定的计划程序,例如cron守护程序或Windows任务计划程序。但是请注意,APScheduler本身不是守护程序或服务,也不是任何命令行工具附带的。它主要是要在现有应用程序中运行。也就是说,APScheduler确实为您提供了一些构建块,以构建调度程序服务或运行专用的调度程序进程。
二.组成介绍
APScheduler有四个组件:触发器(trigger),作业存储(job store),执行器(executor),调度器(scheduler)
触发器(trigger):
包含调度逻辑,每一个作业有它自己的触发器,用于决定接下来哪一个作业会运行。除了他们自己初始配置以外,触发器完全是无状态的,APScheduler 有三种内建的 trigger:
date: 特定的时间点触发
interval: 固定时间间隔触发
cron: 在特定时间周期性地触发
作业存储(job store):
存储被调度的作业,默认的作业存储是简单地把作业保存在内存中,其他的作业存储是将作业保存在数据库中。一个作业的数据将在保存在持久化作业存储时被序列化,并在加载时被反序列化。调度器不能分享同一个作业存储。
APScheduler 默认使用 MemoryJobStore,可以修改使用 DB 存储方案.
执行器(executor):
处理作业的运行,他们通常通过在作业中提交制定的可调用对象到一个线程或者进城池来进行。当作业完成时,执行器将会通知调度器。
最常用的 executor 有两种:
ProcessPoolExecutor
ThreadPoolExecutor
调度器(scheduler):
通常在应用中只有一个调度器,应用的开发者通常不会直接处理作业存储、调度器和触发器,相反,调度器提供了处理这些的合适的接口。配置作业存储和执行器可以在调度器中完成,例如添加、修改和移除作业。
三.举例介绍
固定时间间隔例子:
from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime
def job():
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
# 定义BlockingScheduler
sched = BlockingScheduler()
sched.add_job(job, 'interval', seconds=5) # 固定时间间隔
sched.start()
结果:
2019-12-06 09:45:16
2019-12-06 09:45:21
2019-12-06 09:45:26
*如果最后的项目要通过pyinstaller进行打包,上边的代码可能会出现报错,可能是版本的问题,只要将代码改成下边格式即可:
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.interval import IntervalTrigger
from datetime import datetime
def job():
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
# 定义BlockingScheduler
sched = BlockingScheduler()
interval = IntervalTrigger(seconds=5)
sched.add_job(job, interval) # 固定时间间隔
sched.start()
特定时间触发例子:
from datetime import date
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
def my_job(text):
print(text)
sched.add_job(my_job, 'date', run_date=date(2019, 12, 6), args=['text']) # 函数将会在2019年12月6日零时零点零分执行一次
sched.start()
在特定时间周期触发例子:
from apscheduler.schedulers.blocking import BlockingScheduler
def job_function():
print("Hello World")
sched = BlockingScheduler()
# 函数会在周一到周五的5:30执行,直到2014年5月30号结束
sched.add_job(job_function, 'cron', day_of_week='mon-fri', hour=5, minute=30, end_date='2014-05-30')
sched.start()