Python使用schedule庫實(shí)現(xiàn)任務(wù)定時自動化
引言
在Python的自動化工具庫中,schedule是一個簡潔又強(qiáng)大的存在。無論是定時備份數(shù)據(jù)、周期性抓取網(wǎng)頁,還是定期發(fā)送提醒郵件,schedule庫都能讓我們的代碼按計(jì)劃精準(zhǔn)執(zhí)行。今天我們就深入了解schedule庫的使用,助我們成為任務(wù)調(diào)度小能手!
schedule庫核心函數(shù)速覽
schedule庫通過極簡的語法,實(shí)現(xiàn)復(fù)雜的定時任務(wù)配置。使用前先通過pip命令安裝schedule庫:pip install schedule
其核心函數(shù)和方法如下:
1. schedule.every():創(chuàng)建基礎(chǔ)調(diào)度任務(wù)

功能:開啟一個新的調(diào)度任務(wù),后續(xù)可鏈?zhǔn)秸{(diào)用時間單位和執(zhí)行函數(shù)。
案例:創(chuàng)建一個每分鐘執(zhí)行一次的任務(wù)框架。
import schedule # 創(chuàng)建1個調(diào)度任務(wù),默認(rèn)參數(shù)為1 schedule.every()
2. 時間單位設(shè)置函數(shù)
功能:指定任務(wù)執(zhí)行的時間間隔的屬性函數(shù):seconds、minutes、hours、days、weeks、monday、tuesday、wednesday、thursday、friday、saturday、sunday
案例:設(shè)置每5分鐘執(zhí)行一次的任務(wù)。
importschedule # 每5分鐘執(zhí)行一次任務(wù) every函數(shù)參數(shù)填5,后續(xù)跟著minutes,表示每5分鐘 schedule.every(5).minutes.do(task_function) # 每2小時執(zhí)行一次任務(wù) schedule.every(2).hours.do(task_function) # 每3天執(zhí)行一次任務(wù) schedule.every(3).days.do(task_function) # 每周執(zhí)行一次任務(wù) schedule.every().weeks.do(task_function) # 每2周執(zhí)行一次任務(wù) schedule.every(2).weeks.do(task_function) # 每周1執(zhí)行一次任務(wù) schedule.every().monday.do(task_function) # 每周1和周3執(zhí)行一次任務(wù) schedule.every().monday.wednesday.do(task_function) #或者分開兩個任務(wù) schedule.every().monday.do(task_function) schedule.every().wednesday.do(task_function)
3. at():精準(zhǔn)設(shè)置任務(wù)執(zhí)行的具體時間點(diǎn)
功能:在指定的時間點(diǎn)執(zhí)行任務(wù),常與時間周期函數(shù)(如days()、weeks())結(jié)合使用,支持設(shè)置時、分,格式為HH:MM(24 小時制) 。通過at功能,可以實(shí)現(xiàn) “每天早上 9 點(diǎn)”“每周五下午5點(diǎn)” 等精確的定時需求。
參數(shù):time_str接受一個字符串類型參數(shù),即具體時間點(diǎn),如"09:00"、"17:30" 。tz默認(rèn)為None,默認(rèn)采用當(dāng)前時區(qū)。如果傳入時區(qū)時需要安裝pytz庫。
#每天早上9點(diǎn)執(zhí)行
schedule.every().day.at("09:00").do(task_function)
#每周1早上9點(diǎn)執(zhí)行
schedule.every().monday.at("09:00").do(task_function)
#在東京時區(qū) 每周1早上9點(diǎn)執(zhí)行
schedule.every().monday.at("09:00","Asia/Tokyo").do(task_function)4. do():指定要執(zhí)行的函數(shù)
功能:關(guān)聯(lián)具體的Python函數(shù),在達(dá)到設(shè)定時間時執(zhí)行。
案例:執(zhí)行打印當(dāng)前時間的函數(shù)
import schedule
import time
def print_current_time():
print(time.strftime("%Y-%m-%d %H:%M:%S"))
# 每10秒打印一次當(dāng)前時間
schedule.every(10).seconds.do(print_current_time)5. run_pending():檢查并執(zhí)行待處理任務(wù)
功能:檢查是否有到期任務(wù),若有則執(zhí)行,需在循環(huán)中持續(xù)調(diào)用。
案例:持續(xù)運(yùn)行任務(wù)調(diào)度循環(huán)
import schedule
import time
def task():
print("任務(wù)執(zhí)行!")
schedule.every(2).seconds.do(task)
while True:
schedule.run_pending()6. clear():清除所有任務(wù)
功能:刪除所有已設(shè)置的調(diào)度任務(wù)。
案例:清空所有定時任務(wù)
import schedule # 設(shè)置兩個任務(wù) schedule.every(1).minutes.do(task1) schedule.every(2).minutes.do(task2) # 清空所有任務(wù) schedule.clear()
7. cancel_job(job):取消特定任務(wù)
功能:移除指定的調(diào)度任務(wù),job為do()方法的返回值。
案例:取消特定任務(wù)
import schedule
def task():
print("任務(wù)執(zhí)行!")
job = schedule.every(3).seconds.do(task)
#取消任務(wù)
schedule.cancel_job(job)二、案例
案例 1:定時發(fā)送郵件提醒
import schedule
import time
import smtplib
from email.mime.text import MIMEText
def send_email():
msg = MIMEText('這是定時發(fā)送的郵件提醒!', 'plain', 'utf-8')
msg['Subject'] = '定時郵件'
msg['From'] = 'xxx@xxx.com'
msg['To'] ='xxx@xxx.com'
try:
server = smtplib.SMTP('smtp.qq.com', 587)
server.starttls()
server.login(msg['From'], 'xxxpassword')
server.sendmail(msg['From'],msg['To'], msg.as_string())
server.quit()
print("郵件發(fā)送成功!")
except Exception as e:
print(f"郵件發(fā)送失敗: {e}")
# 每天早上8點(diǎn)發(fā)送郵件
schedule.every().day.at("08:00").do(send_email)
while True:
schedule.run_pending()
time.sleep(1)案例 2:實(shí)現(xiàn)定時數(shù)據(jù)庫備份
import schedule
import time
import subprocess
def backup_data():
backup_command = "mysqldump -u username -ppassword database_name > backup.sql"
try:
subprocess.run(backup_command, shell=True, check=True)
print("數(shù)據(jù)庫備份成功!")
except subprocess.CalledProcessError as e:
print(f"數(shù)據(jù)庫備份失敗: {e}")
# 每隔2天執(zhí)行一次數(shù)據(jù)備份任務(wù)
schedule.every(2).days.do(backup_data)
while True:
schedule.run_pending()
time.sleep(1)三、避坑指南
1.循環(huán)阻塞問題
問題:schedule.run_pending()需在循環(huán)中調(diào)用,但循環(huán)可能會阻塞主線程。
解決:可以使用多線程或多進(jìn)程運(yùn)行調(diào)度循環(huán),避免影響其他程序執(zhí)行。例如:
import schedule
import time
import threading
def run_schedule():
while True:
schedule.run_pending()
time.sleep(1)
# 啟動調(diào)度循環(huán)線程 不影響主線程
schedule_thread = threading.Thread(target=run_schedule)
schedule_thread.start()2.時區(qū)與時間格式
問題:使用at()方法設(shè)置時間時,默認(rèn)使用系統(tǒng)時區(qū),可能與預(yù)期不符。
解決:如需跨時區(qū)調(diào)度,可結(jié)合pytz庫進(jìn)行時區(qū)轉(zhuǎn)換,確保時間準(zhǔn)確。
一些常用見時區(qū):
- 亞洲時區(qū):Asia/Shanghai:中國上海(北京時間)
Asia/Tokyo:日本東京時區(qū)
Asia/Kolkata:印度加爾各答時區(qū)
2. 美洲時區(qū):America/New_York:美國紐約時區(qū)
America/Los_Angeles:美國洛杉磯時區(qū)
America/Toronto:加拿大多倫多時區(qū)
3. 歐洲時區(qū):Europe/London:英國倫敦時區(qū)
Europe/Paris:法國巴黎時區(qū)
Europe/Moscow:俄羅斯莫斯科時區(qū)
4. 大洋洲時區(qū):Australia/Sydney:澳大利亞悉尼時區(qū)
Pacific/Auckland:新西蘭奧克蘭時區(qū)
5. 非洲時區(qū):Africa/Cairo:埃及開羅時區(qū)
Africa/Johannesburg:南非約翰內(nèi)斯堡時區(qū)
掌握schedule庫的這些要點(diǎn),我們就就能輕松實(shí)現(xiàn)各類任務(wù)的定時自動化。無論是個人項(xiàng)目還是工作中的流程優(yōu)化,它都能成為你的得力助手!如果在使用過程中遇到問題,歡迎在評論區(qū)留言交流,謝謝大家的閱讀!
以上就是Python使用schedule庫實(shí)現(xiàn)任務(wù)定時自動化的詳細(xì)內(nèi)容,更多關(guān)于Python schedule庫任務(wù)定時自動化的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Opencv-Python圖像透視變換cv2.warpPerspective的示例
今天小編就為大家分享一篇關(guān)于Opencv-Python圖像透視變換cv2.warpPerspective的示例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04
Python中的變量及簡單數(shù)據(jù)類型應(yīng)用
這篇文章主要介紹了Python中的變量及簡單數(shù)據(jù)類型應(yīng)用,簡單的數(shù)據(jù)類型包括字符串和數(shù)字,更多詳細(xì)內(nèi)容,需要的小伙伴可以參考一下2022-03-03
python中reversed與reverse的區(qū)別解析
reverse()是python中列表的一個內(nèi)置方法(在字典、字符串和元組中沒有這個內(nèi)置方法),用于列表中數(shù)據(jù)的反轉(zhuǎn),這篇文章主要介紹了python中reversed與reverse的區(qū)別,需要的朋友可以參考下2023-03-03
Python中的支持向量機(jī)SVM的使用(附實(shí)例代碼)
這篇文章主要介紹了Python中的支持向量機(jī)SVM的使用(附實(shí)例代碼),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
python curl2pyreqs 生成接口腳本實(shí)戰(zhàn)教程
這篇文章主要介紹了python curl2pyreqs 生成接口腳本實(shí)戰(zhàn)教程,首先下載 curl2pyreqs 庫,打開調(diào)試模式,在Network這里獲取接口的cURL,需要的朋友可以參考下2023-10-10

