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

