python之任务调度(APScheduler和schedule)
一、APScheduler
官方文档
https://apscheduler.readthedocs.io/en/3.x/
APScheduler是一个Python的任务调度库,允许你根据时间间隔、特定日期时间、甚至是依赖于数据触发的事件来调度任务。它支持多种方式来配置和调度任务,包括定时任务、循环任务、日期时间任务等。
1、安装 APScheduler
pip install apscheduler
2、基本概念
Scheduler
: 用于管理所有的作业。Job Store
: 负责保存作业状态和信息的地方。Triggers
: 触发器定义了当作业何时执行的逻辑。Executors
: 用于作为作业运行的环境。
3、创建调度器
from apscheduler.schedulers.background import BackgroundScheduler scheduler = BackgroundScheduler() scheduler.start()
4、创建任务
定义一个简单的任务函数,然后使用 scheduler.add_job()
来添加任务到调度器。
def my_job(): print("Hello APScheduler!") scheduler.add_job(my_job, 'interval', seconds=10) # 每隔10秒执行一次任务
5、停止调度器
scheduler.shutdown()
6、案例
from apscheduler.schedulers.background import BackgroundScheduler from datetime import datetime def print_time(): print(f"Current time: {datetime.now()}") # 创建调度器 scheduler = BackgroundScheduler() scheduler.start() # 添加任务到调度器,每隔5秒执行一次 print_time 函数 scheduler.add_job(print_time, 'interval', seconds=5) # 程序运行10秒后停止调度器 scheduler.shutdown(wait=False)
二、scheduler
1、安装
pip install scheduler
2、设置任务的执行时间间隔的方式
当使用scheduler
库时,schedule.every()
是一个非常有用的方法,它可以让你设置任务的执行时间间隔。下面是一些schedule.every()
的更多用法:
schedule.every().day.at("10:30").do(job)
:在每天的10:30执行任务。schedule.every(10).minutes.do(job)
:每隔10分钟执行任务。schedule.every().hour.do(job)
:每隔一个小时执行任务。schedule.every(2).hours.do(job)
:每隔两个小时执行任务。schedule.every().monday.do(job)
:每周一执行任务。schedule.every().wednesday.at("13:15").do(job)
:每周三的13:15执行任务。
3、案例
if __name__ == "__main__": now = datetime.datetime.now() if 10 < now.minute <= 20: time.sleep(300) schedule.clear() if SCHEDULE_THREAD_STATUS: logger.info("Enable check_process_and_thread schedule task") schedule.every().day.at('18:40').do(do_work, check_thread_num) while True: schedule.run_pending() time.sleep(5)
三、flask-apscheduler
Flask-APScheduler是基于APScheduler库开发的Flask拓展库。
APScheduler的全称是Advanced Python Scheduler。允许您将Python代码安排为稍后执行,可以只执行一次,也可以定期执行。可以随时添加新作业或删除旧作业。
如果将作业存储在数据库中,那么调度程序重启后它们也将存活下来并保持其状态。当调度器重新启动时,它将运行它在离线时应该运行的所有作业,
1、安装
pip install flask-apscheduler
2、触发器 triggers :
触发器包含调度逻辑。每个作业都有自己的触发器,用于确定下一个任务何时运行。除了初始配置之外,触发器是完全无状态的。
有三种内建的trigger:
(1)date: 特定的时间点触发
(2)interval: 固定时间间隔触发
(3)cron: 在特定时间周期性地触发
interval 触发器
weeks (int) 间隔几周 days (int) 间隔几天 hours (int) 间隔几小时 minutes (int) 间隔几分钟 seconds (int) 间隔多少秒 start_date (datetime 或 str) 开始日期 end_date (datetime 或 str) 结束日期 timezone (datetime.tzinfo 或str) 时区
3、
四、二者的异同点
1、相同点:
两者都可用于定时执行任务,都可以设置为在特定的时间或时间间隔内执行任务。
2、不同点:
APScheduler
功能更加完善且复杂,支持后台运行,任务持久化,具有多种调度方式,适合大型项目。
而schedule
更加简单并且人性化,但功能上可能不完备。
在使用上,APScheduler
的复杂性更高,需要使用调度器对象进行操作,而schedule
的使用则更简洁易懂。