天天看點

自動化運維?看看Python怎樣完成自動任務排程⛵

自動化運維?看看Python怎樣完成自動任務排程⛵

💡 作者:韓信子@ShowMeAI

📘 Python3◉技能提升系列:https://www.showmeai.tech/tutorials/56

📘 本文位址:https://www.showmeai.tech/article-detail/323

📢 聲明:版權所有,轉載請聯系平台與作者并注明出處

📢 收藏ShowMeAI檢視更多精彩内容

自動化運維?看看Python怎樣完成自動任務排程⛵

計劃任務是幾乎每個開發人員都會用到的功能,在伺服器上可以用 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/