python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python APScheduler定时任务

Python使用APScheduler设置每月固定日期运行的定时任务

作者:幸福清风

在开发自动化脚本或后台服务时,我们经常需要让某些任务按照特定的时间周期自动执行,Python 的 APScheduler(Advanced Python Scheduler)库是一个强大且灵活的工具,能够轻松地帮助我们实现这些需求,下面我们就来看看具体实现方法吧

在开发自动化脚本或后台服务时,我们经常需要让某些任务按照特定的时间周期自动执行。例如,每月初生成报告、每月末清理日志文件,或者在每月的某个特定日期发送通知。Python 的 APScheduler(Advanced Python Scheduler)库是一个强大且灵活的工具,能够轻松地帮助我们实现这些需求。

本文将详细介绍如何利用 APScheduler 的 Cron 触发器(CronTrigger)来设置每月固定日期运行的定时任务。

1. 理解 Cron 表达式与 APScheduler

APScheduler 提供了多种触发器类型,其中 CronTrigger 最适合处理复杂的周期性任务。它借鉴了 Unix/Linux 系统中的 Cron 表达式概念,但提供了更友好的 Python 接口。

一个典型的 Cron 表达式由六个(或七个)字段组成,分别代表秒、分、时、日(月)、月、周(日)、年(可选)。在 APScheduler 中,我们通常只需要关注前五个字段:

要设置每月固定日期运行,关键在于正确配置 day 参数。

2. 环境准备

首先,确保你已经安装了 APScheduler 库。如果尚未安装,请使用 pip 进行安装:

pip install apscheduler

3. 核心实现:设置每月固定日期

我们将通过几个具体的例子来展示不同的设置方法。

示例 1:每月特定一天运行

这是最常见的场景。假设我们需要在每月 15 号的上午 9:00 执行一个任务。

from datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler # 导入阻塞型调度器

def my_monthly_task():
    """
    定义一个简单的任务函数
    """
    current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print(f"【任务执行】 - 当前时间: {current_time}")
    # 在这里放置你的实际业务逻辑
    # 例如:generate_report(), send_email(), cleanup_logs() 等

# --- 步骤 1: 创建调度器实例 ---
# BlockingScheduler 适用于脚本运行,它会阻塞主线程
scheduler = BlockingScheduler()

# --- 步骤 2: 添加定时任务 ---
scheduler.add_job(
    func=my_monthly_task,      # 要执行的函数对象
    trigger='cron',            # 指定使用 Cron 触发器
    day=15,                    # <--- 关键:指定每月的第15天
    hour=9,                    # 指定在 9 点执行
    minute=0,                  # 指定在 0 分执行
    id='monthly_task_15th'     # (可选) 为任务指定一个唯一ID,方便管理
)

print("定时任务已添加:每月15号上午9:00执行。")

# --- 步骤 3: 启动调度器 ---
try:
    print("调度器已启动,等待任务执行...")
    scheduler.start() # 启动调度器,程序会在此处保持运行状态
except KeyboardInterrupt:
    print("\n接收到中断信号,调度器已关闭。")
    scheduler.shutdown(wait=True) # 平滑关闭调度器

在这个例子中,day=15 明确指定了任务只会在每个月的 15 号运行。需要注意的是,如果你设置 day=31,而当月没有 31 号(如 2 月),那么该月的任务将不会被触发。

示例 2:每月特定几天运行

有时,我们需要在每月的多个固定日期都执行任务。例如,每月 1 号和 15 号。这时,我们可以将 day 参数设置为列表 [1, 15] 或逗号分隔的字符串 '1,15'

# ... (导入和函数定义同上)

# 添加任务:每月1号和15号的上午9:00执行
scheduler.add_job(
    func=my_monthly_task,
    trigger='cron',
    day='1,15',               # <--- 指定每月的1号和15号
    # 或者: day=[1, 15],
    hour=9,
    minute=0,
    id='monthly_task_1st_and_15th'
)

print("定时任务已添加:每月1号和15号上午9:00执行。")

# ... (启动调度器)

示例 3:每月最后一天运行

对于月末操作,比如备份数据或结算,我们可能需要在每月的最后一天执行任务。APScheduler 提供了便捷的表达方式 day='last'

# ... (导入和函数定义同上)

# 添加任务:每月最后一天的上午9:00执行
scheduler.add_job(
    func=my_monthly_task,
    trigger='cron',
    day='last',               # <--- 指定每月的最后一天
    hour=9,
    minute=0,
    id='monthly_task_last_day'
)

print("定时任务已添加:每月最后一天上午9:00执行。")

# ... (启动调度器)

这种方式非常智能,它能自动识别不同月份以及闰年的天数差异。

示例 4:每月特定周几(如每月第一个周一)

除了按日期,我们有时还需要按“第 X 个周 Y”来安排任务。例如,每月第一个周一。APScheduler 也支持这种表达。

# ... (导入和函数定义同上)

# 添加任务:每月第一个周日的上午9:00执行
# 注意:day_of_week='sun' 代表周日,'mon' 代表周一,以此类推
scheduler.add_job(
    func=my_monthly_task,
    trigger='cron',
    day='1st sun',            # <--- 指定每月的第一个周日 ('1st' for first, '2nd' for second, etc.)
    hour=9,
    minute=0,
    id='monthly_task_first_sunday'
)

print("定时任务已添加:每月第一个周日上午9:00执行。")

# ... (启动调度器)

类似的,'2nd mon' 表示每月第二个周一,'3rd tue' 表示每月第三个周二,等等。如果某个月份不满足条件(例如某月没有第五个周日),则该月的任务不会执行。

4. 总结

通过 APSchedulerCronTrigger,我们可以非常灵活地配置各种周期性任务。

结合 hourminute 等参数,可以精确控制任务在每天的具体时刻执行。

到此这篇关于Python使用APScheduler设置每月固定日期运行的定时任务的文章就介绍到这了,更多相关Python APScheduler定时任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文