作者:韩信子@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="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 库,让整个代码流程从功能到自动化任务调度都浑然一体。

参考资料

自动化运维?看看Python怎样完成自动任务调度⛵的更多相关文章

  1. 【目录】Python自动化运维

    目录:Python自动化运维笔记 Python自动化运维 - day2 - 数据类型 Python自动化运维 - day3 - 函数part1 Python自动化运维 - day4 - 函数Part2 ...

  2. Python自动化运维的职业发展道路(暂定)

    Python职业发展之路 Python自动化运维工程 Python基础 Linux Shell Fabric Ansible Playbook Zabbix Saltstack Puppet Dock ...

  3. python自动化运维学习第一天--day1

    学习python自动化运维第一天自己总结的作业 所使用到知识:json模块,用于数据转化sys.exit 用于中断循环退出程序字符串格式化.format字典.文件打开读写with open(file, ...

  4. python自动化运维之路~DAY5

    python自动化运维之路~DAY5 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.模块的分类 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数 ...

  5. Python+Django+ansible playbook自动化运维项目实战☝☝☝

    Python+Django+ansible playbook自动化运维项目实战☝☝☝  一.入门引导 DevOPSDevOps(英文Development和Operations的组合)是一组过程.方法 ...

  6. Python自动化运维:技术与最佳实践 PDF高清完整版|网盘下载内附地址提取码|

    内容简介: <Python自动化运维:技术与最佳实践>一书在中国运维领域将有“划时代”的重要意义:一方面,这是国内第一本从纵.深和实践角度探讨Python在运维领域应用的著作:一方面本书的 ...

  7. python自动化运维之CMDB篇-大米哥

    python自动化运维之CMDB篇 视频地址:复制这段内容后打开百度网盘手机App,操作更方便哦 链接:https://pan.baidu.com/s/1Oj_sglTi2P1CMjfMkYKwCQ  ...

  8. Day1 老男孩python自动化运维课程学习笔记

    2017年1月7日老男孩python自动化运维课程正式开课 第一天学习内容: 上午 1.python语言的基本介绍 python语言是一门解释型的语言,与1989年的圣诞节期间,吉多·范罗苏姆为了在阿 ...

  9. 【实战小项目】python开发自动化运维工具--批量操作主机

    有很多开源自动化运维工具都很好用如ansible/salt stack等,完全不用重复造轮子.只不过,很多运维同学学习Python之后,苦于没小项目训练.本篇就演示用Python写一个批量操作主机的工 ...

  10. Python自动化运维开发实战 一、初识Python

    导语 都忘记是什么时候知道python的了,我是搞linux运维的,早先只是知道搞运维必须会shell,要做一些运维自动化的工作,比如实现一些定时备份数据啊.批量执行某个操作啊.写写监控脚本什么的. ...

随机推荐

  1. 第四篇:理解vue代码

    解释以下代码: 实现输入框中能够打字的功能 <el-input v-model="input" placeholder="在这打字"></el ...

  2. 大促活动如何抵御大流量 DDoS 攻击?

    每一次活动大促带来的迅猛流量,对技术人而言都是一次严峻考验.如果在活动期间遭受黑产恶意DDoS攻击,无疑是雪上加霜.电商的特性是业务常态下通常不会遭受大流量DDoS攻击,且对延迟敏感,因此只需要在活动 ...

  3. P1829 [国家集训队]Crash的数字表格

    P1829 [国家集训队]Crash的数字表格 原题传送门 前置芝士 莫比乌斯反演 乘法逆元 数论分块 正文 //补充:以下式子中的除法均为整除 由题目可以得知,这道题让我们所求的数,用一个式子来表达 ...

  4. Java基础(标识符,数据类型,数据转换,变量)

    注释 Java中的注释有3种: 单行注释 // 多行注释 /**/ 文档注释 /***/ 注释不会被执行,是给我们写代码的人看的 书写注释是一个非常好的习惯 标识符 Java所有的组成部分都需要名字, ...

  5. ProxySQL(12):禁止多路路由

    文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9372447.html multiplexing multiplexing,作用是将语句分多路路由.开启了mu ...

  6. tomcat的catalina.out日志按自定义时间格式进行分割

    默认情况下,tomcat的catalina.out日志文件是没有像其它日志一样,按日期进行分割,而是全部输出全部写入到一个catalina.out,这样日积月累就会造成.out日志越来越大,给管理造成 ...

  7. KubeOperator界面,集群详情中的存储,存储提供商

    点击"添加",假设选择的类型是rook-ceph,表示的是在这个k8s集群里创建rook-ceph集群,而不是显示已经存在的集群 意味着可以使用这种办法在k8s集群里创建rook- ...

  8. 查看当前看k8s集群支持的版本命令

    # kubectl api-versions admissionregistration.k8s.io/v1 admissionregistration.k8s.io/v1beta1 apiexten ...

  9. C++自学笔记 构造与析构;

    构造与析构 类不是实体:对象属于类:函数属于类 : 用不同的对象调用同一个类里面的函数的时候,函数知道是哪一个对象在调用它 关键字 this this是一个指针 Point a; a.print(); ...

  10. 给nsis窗口添加立体阴影

    利用SetClassLong函数给nsis窗口添加了阴影,看起来很酷^_^ System::Call `user32::SetClassLong(i$HWNDPARENT,i${GCL_STYLE}, ...