自動化運維?看看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)整個過程非常程序化和自然,完整的一個『構建任務+任務調度』程序如下(我們把每小時發送一次郵件調整為每天一次了) 。
【自動化運維?看看Python怎樣完成自動任務調度?】import timeimport scheduledef 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 timefrom 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="showmeai@yeah.net")def send_email(email="default_email@yeah.net"):# 發送郵件的操作可以加在這里print(f"Sending email...: to {email}")經過上面的簡單處理,我們可以把電子郵箱當作參數傳遞給調度任務 。如果我們希望通過命令行參數給腳本傳參,一個示例的代碼如下:
import argparsedef send_email(email="default_email@yeah.net"):# 發送郵件的操作可以加在這里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 showmeai@yeah.net# 我們也可以使用默認的郵箱參數$ python send_email.py總結按計劃運行任務是開發過程中的最常見需求之一 , 系統自帶的 Crontab 很好用,但大家也可以試試用 Python 的 schedule 庫,讓整個代碼流程從功能到自動化任務調度都渾然一體 。
參考資料
  • schedule:https://schedule.readthedocs.io/en/stable/

自動化運維?看看Python怎樣完成自動任務調度?

文章插圖

    推薦閱讀