安装
pip install apscheduler
基本使用
基本构成
- 调度器(Scheduler): 调度器是
APScheduler
的核心组件,负责管理和执行任务。APScheduler
提供了不同类型的调度器,包括阻塞调度器(BlockingScheduler
)和非阻塞调度器(BackgroundScheduler
)。 - 触发器(Trigger): 触发器定义了何时执行任务。
APScheduler
支持各种触发器类型,如固定时间间隔触发器(IntervalTrigger
)、日期触发器(DateTrigger
)等。 - 任务(Job): 任务是要执行的操作或函数。在
APScheduler
中,你可以创建任务并将它们与触发器关联起来,以指定何时执行任务。
使用示例
以下是一个使用APScheduler
的示例,演示如何创建一个简单的定时任务,每隔5秒输出一次当前时间:
# -*- coding: utf-8 -*-
# @Author: Mehaei
# @Date: 2023-10-09 20:26:13
# @Last Modified by: Mehaei
# @Last Modified time: 2023-10-09 22:27:28
import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.interval import IntervalTrigger
# 定义一个任务函数
def my_task():
current_time = datetime.datetime.now()
print(f"任务执行时间:{current_time}")
# 创建一个阻塞调度器
scheduler = BlockingScheduler()
# 创建一个触发器,每隔5秒触发一次
trigger = IntervalTrigger(seconds=5)
# 添加任务和触发器到调度器
scheduler.add_job(my_task, trigger)
try:
# 启动调度器
scheduler.start()
except (KeyboardInterrupt, SystemExit):
# 用户按Ctrl C或者程序退出时停止调度器
scheduler.shutdown()
在实际应用中,可以根据需要配置不同类型的触发器和任务,以执行各种定时任务。APScheduler
还支持将任务持久化到数据库,以便在应用重启后保留任务信息。
这只是一个简单的示例,APScheduler
提供了更多高级功能,如定时任务的持久化、任务的传参、任务的异常处理等。下面简单写下触发器和调度器的类型和使用。
触发器
1. IntervalTrigger(固定时间间隔触发器)
IntervalTrigger
以固定的时间间隔执行任务。
from apscheduler.triggers.interval import IntervalTrigger
trigger = IntervalTrigger(seconds=10) # 每隔10秒触发一次
2. CronTrigger(Cron表达式触发器)
CronTrigger
使用Cron表达式来定义任务的执行时间。Cron表达式是一种时间表达式,可以非常精确地定义任务执行时间。
关于crontab可以看这篇文章
使用Crontab:在Linux中自动化任务调度的完全指南
代码语言:javascript复制from apscheduler.triggers.cron import CronTrigger
trigger = CronTrigger(second='0,30') # 每分钟的0秒和30秒触发
3. DateTrigger(指定日期触发器)
DateTrigger
在特定日期和时间执行任务。
from apscheduler.triggers.date import DateTrigger
from datetime import datetime
trigger = DateTrigger(datetime(2023, 9, 1, 10, 30)) # 在2023年9月1日10:30执行任务
4. DailyTrigger(每天触发器)
DailyTrigger
每天的特定时间执行任务。
from apscheduler.triggers.daily import DailyTrigger
trigger = DailyTrigger(hour=12, minute=0) # 每天中午12:00执行任务
5. WeeklyTrigger(每周触发器)
WeeklyTrigger
每周的特定日期和时间执行任务。
from apscheduler.triggers.weekly import WeeklyTrigger
trigger = WeeklyTrigger(day_of_week='mon', hour=8, minute=30) # 每周一早上8:30执行任务
6. MonthlyTrigger(每月触发器)
MonthlyTrigger
每月的特定日期和时间执行任务。
from apscheduler.triggers.monthly import MonthlyTrigger
trigger = MonthlyTrigger(day=15, hour=14, minute=45) # 每月15号下午2:45执行任务
这些触发器提供了广泛的灵活性,可以满足各种定时任务的需求。可以根据具体的任务执行规则选择适当的触发器类型,并将触发器与任务关联起来,以定义任务何时执行。
调度器
1. 阻塞调度器(BlockingScheduler)
阻塞调度器是一种同步调度器,它会阻塞主程序的执行,直到所有的定时任务执行完成。这意味着当一个任务正在执行时,其它任务无法同时执行。这通常用于简单的脚本和小型应用程序中,其中任务的执行不会占用太多时间。
使用示例:
代码语言:javascript复制from apscheduler.schedulers.blocking import BlockingScheduler
scheduler = BlockingScheduler()
# 添加任务
scheduler.add_job(job_function, trigger='interval', seconds=10)
# 启动调度器
scheduler.start()
2. 非阻塞调度器(BackgroundScheduler)
非阻塞调度器是一种异步调度器,它不会阻塞主程序的执行。它使用多线程或多进程来并行执行定时任务,因此可以同时处理多个任务。这对于需要执行耗时任务或在大型应用程序中使用APScheduler的情况非常有用,因为它不会阻塞应用的其它部分。
使用示例:
代码语言:javascript复制from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
# 添加任务
scheduler.add_job(job_function, trigger='interval', seconds=10)
# 启动调度器
scheduler.start()
主要区别:
- 阻塞与非阻塞:阻塞调度器会阻塞主程序的执行,而非阻塞调度器不会。
- 并发执行:非阻塞调度器可以同时执行多个任务,而阻塞调度器一次只能执行一个任务。
- 适用场景:阻塞调度器适用于简单的脚本和小型应用程序,而非阻塞调度器适用于大型应用程序和需要执行耗时任务的情况。
- 启动方式:阻塞调度器使用
scheduler.start()
来启动,而非阻塞调度器也使用相同的方式。
选择哪种调度器取决于你的应用需求。如果你的应用需要同时执行多个任务,或者有耗时任务需要处理,非阻塞调度器是更好的选择。如果你只需简单地执行定时任务,并且不需要考虑并发执行,阻塞调度器可能更容易使用。完了~~~