自动化运维?看看Python怎样结束自动任务调度 ⛵

携手发明,一同成长!这是我参与「日新计划 8 月更文挑战」的第30天,点击检查活动概况

  • 作者:韩信子@ShowMeAI
  • Python3◉技术提高系列:www.showmeai.tech/tutorials/5…
  • 本文地址:www.showmeai.tech/article-det…
  • 声明:版权所有,转载请联系途径与作者并注明出处
  • 收藏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="showmeai@yeah.net")
def send_email(email="default_email@yeah.net"):
    # 发送邮件的操作可以加在这儿
    print(f"Sending email...: to {email}")

通过上面的简单处理,咱们可以把电子邮箱当作参数传递给调度任务。如果咱们期望通过命令行参数给脚本传参,一个示例的代码如下:

import argparse
def 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:schedule.readthedocs.io/en/stable/

自动化运维?看看Python怎样结束自动任务调度 ⛵