💡 作者:韓信子@ShowMeAI
📘 Python3◉技能提升系列:https://www.showmeai.tech/tutorials/56
📘 本文位址:https://www.showmeai.tech/article-detail/323
📢 聲明:版權所有,轉載請聯系平台與作者并注明出處
📢 收藏ShowMeAI檢視更多精彩内容
計劃任務是幾乎每個開發人員都會用到的功能,在伺服器上可以用 Cron 作業來進行任務排程,它也是一種穩定的方式。但我們也可以完全程式化,全部使用 Python 來完成排程程式,而且可以有更簡單的配置方式。
💡 基于 Python 的任務排程
📌 快速安裝與應用
Python工具包 📘schedule可以輕松地在 Python 中進行任務排程,我們可以通過 PyPI 快速安裝它。
$ pip install schedule
借助于 schedule,我們幾乎可以像用自然語言說話一樣快速建構任務計劃和時間表。比如,你想每小時運作一次某個功能函數(比如功能是發郵件的函數
send_email
) ,寫法是這樣的:
schedule.every().hour.do(send_email)
整個過程非常程式化和自然,完整的一個『建構任務+任務排程』程式如下(我們把每小時發送一次郵件調整為每天一次了)。
import time
import schedule
def send_email():
# 發送郵件的操作可以加在這裡
print("Sending email...")
schedule.every().day.at("14:45").do(send_email)
while True:
schedule.run_pending()
time.sleep(1)
上面的代碼将在每天下午14:45 調用
send_email
函數。除書寫簡單易用之外,schedule 工具庫還提供了一系列其他功能。
📌 使用裝飾器進行排程
我們可以使用裝飾器讓代碼更加幹淨和優雅。schedule 工具包支援開箱即用的裝飾器。我們把上面發送電子郵件的示例改用裝飾器完成,代碼如下。
import time
from schedule import repeat, every, run_pending
@repeat(every(10).seconds)
@repeat(every(5).seconds)
def send_email():
# 發送郵件的操作可以加在這裡
print("Sending email...")
while True:
run_pending()
time.sleep(1)
上述代碼示例中,我們為同一個任務定制了兩個計劃。第一個将每 10 秒調用一次功能函數,第二個将每 5 秒調用一次。
📌 使用參數運作計劃任務
我們有時候會希望任務的調用更靈活一些,比如如果可以通過傳遞參數來控制任務排程,那就免去了寫死各種細節的問題。下面我們把發郵件的任務寫成可接受參數的形式:
@repeat(every(10).seconds)
@repeat(every(5).seconds, email="[email protected]")
def send_email(email="[email protected]"):
# 發送郵件的操作可以加在這裡
print(f"Sending email...: to {email}")
經過上面的簡單處理,我們可以把電子郵箱當作參數傳遞給排程任務。如果我們希望通過指令行參數給腳本傳參,一個示例的代碼如下:
import argparse
def send_email(email="[email protected]"):
# 發送郵件的操作可以加在這裡
print(f"Sending email...: to {email}")
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("-e", "--email", help="Email to send")
args = parser.parse_args()
if args.email:
send_email(args.email)
else:
send_email()
$ python send_mail.py -e [email protected]
# 我們也可以使用預設的郵箱參數
$ python send_email.py
💡 總結
參考資料
- 📘 schedule:https://schedule.readthedocs.io/en/stable/