1. 設定簡單任務
讓我們從最簡單的例子開始:如何讓我們的程式每天提醒自己檢查電子郵件。
import schedule
import time
def job():
print("提醒:檢查您的郵箱!")
# 設定任務每天執行
schedule.every().day.at("09:00").do(job)
while True:
schedule.run_pending()
time.sleep(1)
在這個例子中,函數 job 將會每天於上午 9 點被執行。schedule 庫每秒會透過 run_pending() 檢查是否有排程中的任務。不要忘記你的程式需要持續運行,才能確保任務正常執行。
給進階用戶的提示
請注意,你可以使用 every().hour 來讓任務每小時執行一次,或是 every(2).hours 讓其每兩小時執行一次。功能幾乎是無限的。
2. 只在工作日提醒
現在我們增加一些複雜性:假設你只需要在工作日收到提醒。例如,我們希望在每個工作日收到同樣的提醒。
import schedule
import time
def weekday_job():
print("工作提醒:不要忘記準備報表!")
schedule.every().monday.at("08:00").do(weekday_job)
schedule.every().tuesday.at("08:00").do(weekday_job)
schedule.every().wednesday.at("08:00").do(weekday_job)
schedule.every().thursday.at("08:00").do(weekday_job)
schedule.every().friday.at("08:00").do(weekday_job)
while True:
schedule.run_pending()
time.sleep(1)
在這種情況下,每週一至週五的早上 8 點,你都會收到一則提醒,告訴你準備報表。這樣一來,即使你忘記了,你的腳本也會按照計畫進行。
3. 設定每週一次的任務
如果你想每週日收到提醒怎麼辦?比如說,你想在工作週開始前檢查你的咖啡儲備。來看一下該如何實現:
import schedule
import time
def sunday_job():
print("提醒:檢查下週的咖啡儲量!")
schedule.every().sunday.at("18:00").do(sunday_job)
while True:
schedule.run_pending()
time.sleep(1)
這段小代碼會幫助你有條不紊地度過週日,提醒你為下週做好準備。現在,你的咖啡永遠不會在最意想不到的時候用完了。是的,我知道,對很多人來說,這可能是一場災難。
4. 修改任務
從排程中移除任務
如果需要取消某個任務的執行,可以使用 cancel_job() 方法。例如,要從排程中刪除任務,可以取得任務對象並為其呼叫 cancel_job()。
job = schedule.every().day.at("09:00").do(daily_task)
schedule.cancel_job(job) # 從排程中移除任務
修改任務時間
要修改任務的執行時間,可以重新為其設定排程。例如,如果任務原本設定在上午 9 點執行,但現在需要改到上午 10 點,我們可以重新安排它的排程。
# 設定任務每天上午 9 點執行
job = schedule.every().day.at("09:00").do(my_task)
# 將任務時間改為上午 10 點
job.clear() # 清除當前任務排程
job.at("10:00") # 設定新的執行時間
檢查活躍任務
若想知道是否有排程中的任務,可以透過 schedule.jobs 輸出所有活躍任務的清單。這在需要掌握所有排程中任務的資訊時非常有用。
# 增加幾個任務
schedule.every().day.at("09:00").do(my_task)
schedule.every().monday.at("10:00").do(my_task)
# 檢視所有活躍任務
for job in schedule.jobs:
print("任務:", job)
清除所有任務
若需要清除排程並刪除所有已排程任務,可以使用 clear() 方法。
# 設定幾個任務
schedule.every().day.at("09:00").do(my_task)
schedule.every().hour.do(my_task)
# 清除排程
schedule.clear()
只執行一次的任務
有時候需要讓任務在指定時間只執行一次。此時可以在執行後使用 schedule.cancel_job(job) 方法取消該任務。
def one_time_task():
print("任務已執行一次")
return schedule.CancelJob # 執行後取消該任務
# 設定任務只執行一次
schedule.every().day.at("09:00").do(one_time_task)
while True:
schedule.run_pending()
time.sleep(1)
5. 實際應用場景
現在讓我們來嚴肅地討論一下:如何在專業環境中應用類似的自動化?在現實中,你可以用任務排程來:
- 自動每日或每週收集數據。
- 在指定的日期和時間創建和發送報表。
- 監控伺服器或網頁介面的狀態,並通知錯誤。
- 執行定期的資料庫備份。
常見錯誤
當你在進行任務排程時,需要注意時間的不同步性,例如你的伺服器和你的本地電腦處於不同的時區。此外,如果你的腳本意外結束,排程中的任務將無法執行。建議使用監控工具,例如 cron(適用於 Unix 系統)或 Windows Task Scheduler。
如果你不小心忘記在迴圈最後加入 time.sleep(1),你的程式將會成為一個像超級活躍碼一樣,持續地占用 CPU。總之,記得讓你的腳本一直穩定運行。
GO TO FULL VERSION