CodeGym /課程 /Python SELF TW /設定重複任務(每日與每週提醒)

設定重複任務(每日與每週提醒)

Python SELF TW
等級 40 , 課堂 0
開放

1. 設定簡單任務

讓我們從最簡單的例子開始:如何讓我們的程式每天提醒自己檢查電子郵件。

Python

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. 只在工作日提醒

現在我們增加一些複雜性:假設你只需要在工作日收到提醒。例如,我們希望在每個工作日收到同樣的提醒。

Python

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. 設定每週一次的任務

如果你想每週日收到提醒怎麼辦?比如說,你想在工作週開始前檢查你的咖啡儲備。來看一下該如何實現:

Python

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()

Python

job = schedule.every().day.at("09:00").do(daily_task)
schedule.cancel_job(job)  # 從排程中移除任務

修改任務時間

要修改任務的執行時間,可以重新為其設定排程。例如,如果任務原本設定在上午 9 點執行,但現在需要改到上午 10 點,我們可以重新安排它的排程。

Python

# 設定任務每天上午 9 點執行
job = schedule.every().day.at("09:00").do(my_task)

# 將任務時間改為上午 10 點
job.clear()  # 清除當前任務排程
job.at("10:00")  # 設定新的執行時間

檢查活躍任務

若想知道是否有排程中的任務,可以透過 schedule.jobs 輸出所有活躍任務的清單。這在需要掌握所有排程中任務的資訊時非常有用。

Python

# 增加幾個任務
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() 方法。

Python

# 設定幾個任務
schedule.every().day.at("09:00").do(my_task)
schedule.every().hour.do(my_task)

# 清除排程
schedule.clear()

只執行一次的任務

有時候需要讓任務在指定時間只執行一次。此時可以在執行後使用 schedule.cancel_job(job) 方法取消該任務。

Python

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。總之,記得讓你的腳本一直穩定運行。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION