1. 簡介 schedule 函式庫
在這堂課,我們會像鐘錶機械一樣學習如何根據排程啟動任務,讓我們的程式碼在我們想要的時候運行。準備好了嗎?今天我們要駕馭時間!
函式庫 schedule 是一個輕量模組,用來按照設定的時間表執行函式。如果你的程式必須根據排程執行,例如每天早上 6 點收集數據或發送每日提醒,那麼 schedule 就是你需要的工具。
schedule 的主要優點包括:
- 簡易性: 直觀的介面,比透過
cron或threading的標準解決方案簡單得多。 - 極簡: 沒有多餘的功能——只有必要的功能。
- 清晰: 使用幾乎像自然語言的方式來設定時間表。
安裝函式庫
首先需要安裝 schedule 函式庫。像大多數 Python 函式庫一樣,我們使用 pip:
pip install schedule
現在,一切準備就緒,讓我們進入自動化的世界,看看 schedule 如何改變你的日常工作。
schedule 函式庫的基本方法
schedule 提供了一些方法,用於設定不同時間和頻率的任務:
every().day.at("HH:MM")— 每天在指定時間執行任務。every().hour— 每小時執行任務。every().minute— 每分鐘執行任務。every().week.at("HH:MM")— 每周在指定時間執行任務。every().monday.at("HH:MM")— 每週一在指定時間執行任務。every(10).seconds— 每 10 秒(或任意其他時間)執行任務。
2. 設定重複任務
讓我們從簡單的例子開始——排程一個函式,每小時執行一次。我們將建立一個簡單的函式,輸出一條歡迎訊息,並根據排程啟動它。
範例:每小時歡迎提醒
import schedule
import time
def say_hello():
print("你好!我們正在進行時間自動化的工作。")
# 每小時執行一次 say_hello 函式
schedule.every().hour.do(say_hello)
while True:
# 執行所有到時間的任務
schedule.run_pending()
time.sleep(1)
就這樣——你的第一個 schedule 腳本完成了!在這個例子中,我們使用方法 every().hour.do(say_hello),每小時說一次「你好!」是不是很有趣?
指令 schedule.every().hour.do(say_hello) 並不會直接執行函式 say_hello,而是將其加入時間表。當時間到了,它會透過代碼 schedule.run_pending() 呼叫這個函式。
3. 設定更複雜的時間間隔
如果我們希望不僅每小時執行任務,還想要每 10 分鐘執行一次,或者在特定的星期幾執行,該怎麼辦?schedule 支援大部分常見的時間表表達式,你可以輕鬆地使用它們。
範例:每 10 分鐘執行一次任務
import schedule
import time
def task():
print("這個任務每 10 分鐘執行一次。")
# 排程每 10 分鐘執行一次任務
schedule.every(10).minutes.do(task)
while True:
schedule.run_pending() # 執行所有到時間的任務
time.sleep(1)
範例:特定星期執行的任務
現在我們來試試排程一個任務,每週一和週三早上 9 點執行。
import schedule
import time
def monday_wednesday_task():
print("這個任務在每週一和週三上午 9 點執行。")
# 排程每週一和週三早上 9 點執行任務
schedule.every().monday.at("09:00").do(monday_wednesday_task)
schedule.every().wednesday.at("09:00").do(monday_wednesday_task)
while True:
schedule.run_pending()
time.sleep(1)
可以看到,schedule 處理各種時間表表達式,包括星期幾和精確的執行時間。這對於與工作或計劃事件同步的任務排程非常方便。
4. 處理有多種條件的任務
如果你的腳本需要執行多個任務,且每個任務都有自己的時間表,schedule 也可以輕鬆處理。例如,一個任務每天早上執行,另一個任務在每週五執行。
範例:將不同的任務結合在一個腳本中
import schedule
import time
def morning_task():
print("早安!該執行早晨的任務了。")
def friday_task():
print("耶,星期五!該執行星期五的任務了。")
# 每天早上 7:30 的任務
schedule.every().day.at("07:30").do(morning_task)
# 每週五下午 4:00 的任務
schedule.every().friday.at("16:00").do(friday_task)
while True:
schedule.run_pending()
time.sleep(1)
實用建議與常見錯誤
當使用 schedule 進行任務自動化時,有幾點值得注意。
首先,請記住 schedule 在主線程中運行任務。這意味著,如果你的任務執行時間過長或可能會阻塞其他任務,應該考慮使用多線程或非同步呼叫來處理任務。
其次,如果你的任務需要在特定時間準確執行,請確保你的設備處於開啟狀態且腳本正在運行。如果腳本停止或設備關機,schedule 不會執行任務。
最後,一個常見的誤解是認為 schedule 會補償錯過的任務。遺憾的是,如果腳本在某個任務應該執行時未運行,schedule 不會追溯執行該任務。
GO TO FULL VERSION