自动化运维?看看Python怎样完成自动任务调度⛵

作者:韩信子@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怎样完成自动任务调度⛵的更多相关文章
- 【目录】Python自动化运维
目录:Python自动化运维笔记 Python自动化运维 - day2 - 数据类型 Python自动化运维 - day3 - 函数part1 Python自动化运维 - day4 - 函数Part2 ...
- Python自动化运维的职业发展道路(暂定)
Python职业发展之路 Python自动化运维工程 Python基础 Linux Shell Fabric Ansible Playbook Zabbix Saltstack Puppet Dock ...
- python自动化运维学习第一天--day1
学习python自动化运维第一天自己总结的作业 所使用到知识:json模块,用于数据转化sys.exit 用于中断循环退出程序字符串格式化.format字典.文件打开读写with open(file, ...
- python自动化运维之路~DAY5
python自动化运维之路~DAY5 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.模块的分类 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数 ...
- Python+Django+ansible playbook自动化运维项目实战☝☝☝
Python+Django+ansible playbook自动化运维项目实战☝☝☝ 一.入门引导 DevOPSDevOps(英文Development和Operations的组合)是一组过程.方法 ...
- Python自动化运维:技术与最佳实践 PDF高清完整版|网盘下载内附地址提取码|
内容简介: <Python自动化运维:技术与最佳实践>一书在中国运维领域将有“划时代”的重要意义:一方面,这是国内第一本从纵.深和实践角度探讨Python在运维领域应用的著作:一方面本书的 ...
- python自动化运维之CMDB篇-大米哥
python自动化运维之CMDB篇 视频地址:复制这段内容后打开百度网盘手机App,操作更方便哦 链接:https://pan.baidu.com/s/1Oj_sglTi2P1CMjfMkYKwCQ ...
- Day1 老男孩python自动化运维课程学习笔记
2017年1月7日老男孩python自动化运维课程正式开课 第一天学习内容: 上午 1.python语言的基本介绍 python语言是一门解释型的语言,与1989年的圣诞节期间,吉多·范罗苏姆为了在阿 ...
- 【实战小项目】python开发自动化运维工具--批量操作主机
有很多开源自动化运维工具都很好用如ansible/salt stack等,完全不用重复造轮子.只不过,很多运维同学学习Python之后,苦于没小项目训练.本篇就演示用Python写一个批量操作主机的工 ...
- Python自动化运维开发实战 一、初识Python
导语 都忘记是什么时候知道python的了,我是搞linux运维的,早先只是知道搞运维必须会shell,要做一些运维自动化的工作,比如实现一些定时备份数据啊.批量执行某个操作啊.写写监控脚本什么的. ...
随机推荐
- React报错之You provided a `checked` prop to a form field
正文从这开始~ 总览 当我们在多选框上设置了checked 属性,却没有onChange 处理函数时,会产生"You provided a checked prop to a form fi ...
- 大家都能看得懂的源码 - ahooks 是怎么处理 DOM 的?
本文是深入浅出 ahooks 源码系列文章的第十三篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 本篇文章探讨一下 ahooks 对 DOM 类 Hooks 使用 ...
- C#基础_手动书写XML
XML文档内容: 1.文档声明2.元素=标签 文档总至少要有一个根元素3.属性4.注释 <!--注释内容-->5.CDATA区.特殊字符 <![CDATA[不想解析的内容]]&g ...
- 第七十九篇:数组方法(forEach,some,every,reduce)
好家伙,来复习几个数组方法, 1.forEach循环与some循环 代码如下: <script> const arr =['奔驰','宝马','GTR','奥迪'] //forEach循环 ...
- 【Elasticsearch】ES选主流程分析
Raft协议 Raft是分布式系统中的一种共识算法,用于在集群中选举Leader管理集群.Raft协议中有以下角色: Leader(领导者):集群中的领导者,负责管理集群. Candidate(候选者 ...
- k8s pod被驱逐问题分析及解决
- 使用nginx代理nexus,不是/根路径
location /nexus/ { proxy_pass http://192.168.0.218:8081/; proxy_set_header Host $host:$server_port; ...
- 单台主机MySQL多实例部署
二进制安装mysql-5.7.26 [root@mysql ~]# cd /server/tools/ [root@mysql tools]# ll total 629756 -rw-r--r-- 1 ...
- 4_爬NMPA药监总局_动态加载_传ID
http://scxk.nmpa.gov.cn:81/xk/ import requests url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAc ...
- 【Azure 应用服务】App Service频繁出现 Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener 异常分析
问题描述 在使用App Service的过程中,发现应用频繁出现503错误,通过Kudu站点获取到Logfiles. 在 Eventlog.xml 文件中,发现大量的 Microsoft.Window ...