Python使用APScheduler設(shè)置每月固定日期運(yùn)行的定時(shí)任務(wù)
在開發(fā)自動(dòng)化腳本或后臺(tái)服務(wù)時(shí),我們經(jīng)常需要讓某些任務(wù)按照特定的時(shí)間周期自動(dòng)執(zhí)行。例如,每月初生成報(bào)告、每月末清理日志文件,或者在每月的某個(gè)特定日期發(fā)送通知。Python 的 APScheduler(Advanced Python Scheduler)庫(kù)是一個(gè)強(qiáng)大且靈活的工具,能夠輕松地幫助我們實(shí)現(xiàn)這些需求。
本文將詳細(xì)介紹如何利用 APScheduler 的 Cron 觸發(fā)器(CronTrigger)來設(shè)置每月固定日期運(yùn)行的定時(shí)任務(wù)。
1. 理解 Cron 表達(dá)式與 APScheduler
APScheduler 提供了多種觸發(fā)器類型,其中 CronTrigger 最適合處理復(fù)雜的周期性任務(wù)。它借鑒了 Unix/Linux 系統(tǒng)中的 Cron 表達(dá)式概念,但提供了更友好的 Python 接口。
一個(gè)典型的 Cron 表達(dá)式由六個(gè)(或七個(gè))字段組成,分別代表秒、分、時(shí)、日(月)、月、周(日)、年(可選)。在 APScheduler 中,我們通常只需要關(guān)注前五個(gè)字段:
second(秒)minute(分鐘)hour(小時(shí))day(日,即每月的第幾天)month(月)day_of_week(周,即一周的第幾天)
要設(shè)置每月固定日期運(yùn)行,關(guān)鍵在于正確配置 day 參數(shù)。
2. 環(huán)境準(zhǔn)備
首先,確保你已經(jīng)安裝了 APScheduler 庫(kù)。如果尚未安裝,請(qǐng)使用 pip 進(jìn)行安裝:
pip install apscheduler
3. 核心實(shí)現(xiàn):設(shè)置每月固定日期
我們將通過幾個(gè)具體的例子來展示不同的設(shè)置方法。
示例 1:每月特定一天運(yùn)行
這是最常見的場(chǎng)景。假設(shè)我們需要在每月 15 號(hào)的上午 9:00 執(zhí)行一個(gè)任務(wù)。
from datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler # 導(dǎo)入阻塞型調(diào)度器
def my_monthly_task():
"""
定義一個(gè)簡(jiǎn)單的任務(wù)函數(shù)
"""
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(f"【任務(wù)執(zhí)行】 - 當(dāng)前時(shí)間: {current_time}")
# 在這里放置你的實(shí)際業(yè)務(wù)邏輯
# 例如:generate_report(), send_email(), cleanup_logs() 等
# --- 步驟 1: 創(chuàng)建調(diào)度器實(shí)例 ---
# BlockingScheduler 適用于腳本運(yùn)行,它會(huì)阻塞主線程
scheduler = BlockingScheduler()
# --- 步驟 2: 添加定時(shí)任務(wù) ---
scheduler.add_job(
func=my_monthly_task, # 要執(zhí)行的函數(shù)對(duì)象
trigger='cron', # 指定使用 Cron 觸發(fā)器
day=15, # <--- 關(guān)鍵:指定每月的第15天
hour=9, # 指定在 9 點(diǎn)執(zhí)行
minute=0, # 指定在 0 分執(zhí)行
id='monthly_task_15th' # (可選) 為任務(wù)指定一個(gè)唯一ID,方便管理
)
print("定時(shí)任務(wù)已添加:每月15號(hào)上午9:00執(zhí)行。")
# --- 步驟 3: 啟動(dòng)調(diào)度器 ---
try:
print("調(diào)度器已啟動(dòng),等待任務(wù)執(zhí)行...")
scheduler.start() # 啟動(dòng)調(diào)度器,程序會(huì)在此處保持運(yùn)行狀態(tài)
except KeyboardInterrupt:
print("\n接收到中斷信號(hào),調(diào)度器已關(guān)閉。")
scheduler.shutdown(wait=True) # 平滑關(guān)閉調(diào)度器在這個(gè)例子中,day=15 明確指定了任務(wù)只會(huì)在每個(gè)月的 15 號(hào)運(yùn)行。需要注意的是,如果你設(shè)置 day=31,而當(dāng)月沒有 31 號(hào)(如 2 月),那么該月的任務(wù)將不會(huì)被觸發(fā)。
示例 2:每月特定幾天運(yùn)行
有時(shí),我們需要在每月的多個(gè)固定日期都執(zhí)行任務(wù)。例如,每月 1 號(hào)和 15 號(hào)。這時(shí),我們可以將 day 參數(shù)設(shè)置為列表 [1, 15] 或逗號(hào)分隔的字符串 '1,15'。
# ... (導(dǎo)入和函數(shù)定義同上)
# 添加任務(wù):每月1號(hào)和15號(hào)的上午9:00執(zhí)行
scheduler.add_job(
func=my_monthly_task,
trigger='cron',
day='1,15', # <--- 指定每月的1號(hào)和15號(hào)
# 或者: day=[1, 15],
hour=9,
minute=0,
id='monthly_task_1st_and_15th'
)
print("定時(shí)任務(wù)已添加:每月1號(hào)和15號(hào)上午9:00執(zhí)行。")
# ... (啟動(dòng)調(diào)度器)示例 3:每月最后一天運(yùn)行
對(duì)于月末操作,比如備份數(shù)據(jù)或結(jié)算,我們可能需要在每月的最后一天執(zhí)行任務(wù)。APScheduler 提供了便捷的表達(dá)方式 day='last'。
# ... (導(dǎo)入和函數(shù)定義同上)
# 添加任務(wù):每月最后一天的上午9:00執(zhí)行
scheduler.add_job(
func=my_monthly_task,
trigger='cron',
day='last', # <--- 指定每月的最后一天
hour=9,
minute=0,
id='monthly_task_last_day'
)
print("定時(shí)任務(wù)已添加:每月最后一天上午9:00執(zhí)行。")
# ... (啟動(dòng)調(diào)度器)這種方式非常智能,它能自動(dòng)識(shí)別不同月份以及閏年的天數(shù)差異。
示例 4:每月特定周幾(如每月第一個(gè)周一)
除了按日期,我們有時(shí)還需要按“第 X 個(gè)周 Y”來安排任務(wù)。例如,每月第一個(gè)周一。APScheduler 也支持這種表達(dá)。
# ... (導(dǎo)入和函數(shù)定義同上)
# 添加任務(wù):每月第一個(gè)周日的上午9:00執(zhí)行
# 注意:day_of_week='sun' 代表周日,'mon' 代表周一,以此類推
scheduler.add_job(
func=my_monthly_task,
trigger='cron',
day='1st sun', # <--- 指定每月的第一個(gè)周日 ('1st' for first, '2nd' for second, etc.)
hour=9,
minute=0,
id='monthly_task_first_sunday'
)
print("定時(shí)任務(wù)已添加:每月第一個(gè)周日上午9:00執(zhí)行。")
# ... (啟動(dòng)調(diào)度器)類似的,'2nd mon' 表示每月第二個(gè)周一,'3rd tue' 表示每月第三個(gè)周二,等等。如果某個(gè)月份不滿足條件(例如某月沒有第五個(gè)周日),則該月的任務(wù)不會(huì)執(zhí)行。
4. 總結(jié)
通過 APScheduler 的 CronTrigger,我們可以非常靈活地配置各種周期性任務(wù)。
day=N: 每月 N 號(hào)。day='N,M'或day=[N, M]: 每月 N 號(hào)和 M 號(hào)。day='last': 每月最后一天。day='last-N': 每月倒數(shù)第 N 天。day='1st mon',day='2nd tue': 每月第一個(gè)周一,第二個(gè)周二等。
結(jié)合 hour 和 minute 等參數(shù),可以精確控制任務(wù)在每天的具體時(shí)刻執(zhí)行。
到此這篇關(guān)于Python使用APScheduler設(shè)置每月固定日期運(yùn)行的定時(shí)任務(wù)的文章就介紹到這了,更多相關(guān)Python APScheduler定時(shí)任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中的defaultdict與__missing__()使用介紹
下面這篇文章主要給大家介紹了關(guān)于Python中defaultdict使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-02-02
Python打包文件夾的方法小結(jié)(zip,tar,tar.gz等)
這篇文章主要介紹了Python打包文件夾的方法,結(jié)合實(shí)例形式總結(jié)分析了Python打包成zip,tar,tar.gz等格式文件的操作技巧,需要的朋友可以參考下2016-09-09
Python中實(shí)現(xiàn)限定抽獎(jiǎng)次數(shù)的機(jī)制的項(xiàng)目實(shí)踐
抽獎(jiǎng)系統(tǒng)作為吸引用戶、提高用戶參與度和活躍度的重要手段,本文主要介紹了Python中實(shí)現(xiàn)限定抽獎(jiǎng)次數(shù)的機(jī)制的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05
一文搞懂Python中輕量型數(shù)據(jù)庫(kù)SQLite3的用法
SQLite 是一個(gè)極受歡迎的輕量級(jí)數(shù)據(jù)庫(kù),它被廣泛應(yīng)用于各種大小的項(xiàng)目中,本文將詳細(xì)介紹 Python 中如何使用 SQLite3 庫(kù)進(jìn)行數(shù)據(jù)庫(kù)操作,感興趣的小伙伴可以了解下2025-07-07
Python自然語(yǔ)言處理 NLTK 庫(kù)用法入門教程【經(jīng)典】
這篇文章主要介紹了Python自然語(yǔ)言處理 NLTK 庫(kù)用法,結(jié)合實(shí)例形式詳細(xì)分析了NLTK庫(kù)的功能、安裝、引用以及使用NLTK庫(kù)進(jìn)行文本分析的各種常用操作技巧,需要的朋友可以參考下2018-06-06
Pandas庫(kù)之DataFrame使用的學(xué)習(xí)筆記
這篇文章主要介紹了Pandas庫(kù)之DataFrame使用的學(xué)習(xí)筆記,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
通過Python將MP4視頻轉(zhuǎn)換為GIF動(dòng)畫
Python可用于讀取常見的MP4視頻格式并將其轉(zhuǎn)換為GIF動(dòng)畫。本文將詳細(xì)為大家介紹實(shí)現(xiàn)的過程,文中的代碼具有一定的參考價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下2021-12-12
python 讀取文件并把矩陣轉(zhuǎn)成numpy的兩種方法
今天小編就為大家分享一篇python 讀取文件并把矩陣轉(zhuǎn)成numpy的兩種方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-02-02

