[Python系列] 定时任务调度

起因

        在计算机网络中,我们经常定期发送数据包、定期更新网络状态等;在操作系统中,也需要定时定期备份数据、定期清理缓存等;在应用程序中,我们也很需要定期更新数据、定期发送通知等。所以,到底怎么样才能有效地实现这样的定时任务呢?这次还是基于简单的Python写个脚本说一说把。

什么是定时任务

        定时任务是指在规定的时间间隔内自动执行某些任务的机制,它通常用于需要定期执行的任务,例如定期备份数据、定期发送邮件、定期更新数据等。
        在计算机系统中,定时任务通常由定时器来实现。定时器是一种硬件或软件机制,可以在规定的时间间隔内触发某个事件或执行某个任务。在操作系统中,定时器通常是由内核来实现的,用户空间程序可以通过系统调用或库函数来设置定时器。

简单的定时任务

        在Python中,提供了schedule库可以用于生成定时任务。我们先来写个简单的示例。

pip install schedule

        通过pip安装完包之后,就可以写个示例了。 

import schedule
import timedef job1():print("I'm working... in job1  start")def job2():print("I'm working... in job2")schedule.every(1).seconds.do(job1)
schedule.every(2).seconds.do(job2)while True:schedule.run_pending()print('sleep')time.sleep(1)

        在上面的代码中,我们首先导入了 schedule 库和 time 库,定义了两个方法,job1和job2,然后分别设置了启动时间,则每1秒启动一次job1,每2秒启动一次job2。通过schedule.run_pending的方法来调用保证程序不退出,当我们运行时就可以看到对应的效果了。

        在简单的任务中,我们使用schedule库就足够了,遇到一些其他的复杂情况就必须麻烦一点了。这边介绍一下schedule的问题:

        1. 定时任务的精度有限:schedule 库的定时任务调度精度有限,它只能保证在指定的时间间隔内执行任务,但不能保证任务的精确执行时间。这是因为 schedule 库使用的是操作系统的定时器,而操作系统的定时器精度一般较低。
        2. 不支持多线程:schedule 库不支持多线程,因此不能在多个线程之间共享定时任务。如果需要在多个线程之间共享定时任务,可以考虑使用其他定时任务调度库,如 threading 库。
        3. 存在安全隐患:schedule 库在执行定时任务时,可能会存在安全隐患。例如,如果定时任务在执行时访问了网络资源,可能会导致网络攻击。因此,在使用 schedule 库时,需要谨慎对待定时任务的执行。

复杂定时任务

        主要在python的语言限制下,我们没必要重复造轮子,还是用已经很完备的轮子来实现需要的内容吧。这边简单介绍一下Python APSscheduler
        Python APScheduler 是一个基于 Python 语言的定时任务调度工具,它借鉴了 Apache Scheduler 的设计理念和功能,但使用了 Python 语言实现。它可以在 Python 应用程序中添加定时任务,以实现周期性或基于特定触发条件的任务执行。

        Python APScheduler 具有以下特点:
        1. 简单易用:用户只需使用几个简单的函数即可实现定时任务的添加、修改和删除,无需编写复杂的代码。
        2. 灵活性:Python APScheduler 支持多种触发器,如 DateTrigger、IntervalTrigger 和 CronTrigger 等,用户可以根据不同的需求选择不同的触发器。
        3. 可扩展性:Python APScheduler 支持多种执行器,如 AsyncIOExecutor、GeventExecutor 和 ThreadPoolExecutor 等,用户可以根据不同的需求选择不同的执行器。
        4. 监控和管理:Python APScheduler 提供了一些简单的监控和管理接口,用户可以查看任务的状态和历史记录,方便故障排查和性能优化。

        安装和下载:        

pip install APSCheduler

        Demo和解释

from apscheduler.schedulers.blocking import BlockingScheduler
import datetimedef job():print("任务正在执行,当前日期和时间:", datetime.datetime.now())if __name__ == "__main__":scheduler = BlockingScheduler()scheduler.add_job(job, 'interval', seconds=5)scheduler.start()

        在这个示例中,我们首先导入了 BlockingScheduler 和 datetime 模块。然后我们定义了一个 job 函数,它会在任务执行时输出当前日期和时间。在主程序中,我们创建了一个 BlockingScheduler 对象,然后使用 add_job 方法添加了一个定期任务。这里的参数 interval 表示任务的执行间隔,单位为秒。最后,我们调用 start 方法启动任务调度程序。

        概念

        ApScheduler 的核心概念是任务(Task)和触发器(Trigger)。任务是一个要执行的操作,可以是一个函数、一个方法或者一个可执行文件。触发器是任务执行的条件,可以是一个时间点、一个时间间隔、一个事件(如文件变化、数据库触发等)或者一个定制的触发条件。
        ApScheduler 提供了多种任务调度策略,例如:
        1. 基于时间间隔的定期任务:任务在指定的时间间隔内重复执行。
        2. 基于时间点的定期任务:任务在指定的时间点重复执行。
        3. 基于事件的一次性任务:任务在特定事件发生时执行一次。
        4. 基于周期的一次性任务:任务在指定的时间间隔内执行一次。

        除了预定任务外,ApScheduler 还支持以下功能:
        1. 任务依赖关系:允许任务之间建立依赖关系,以便在执行任务时确保它们按照正确的顺序执行。
        2. 任务分组:将任务分组到特定的分组中,以便更好地组织任务并允许针对分组执行操作(如暂停、恢复等)。
        3. 任务调度器插件:允许您为 ApScheduler 添加自定义任务调度器,以实现特定的任务调度需求。
        4. 任务历史记录:保存任务执行的历史记录,以便您可以查看任务执行的情况。

        使用方法

        首先需要先定义一个APScheduler的对象,像上诉代码一样,定一个的是一个BlockingScheuler,然后通过add_job的方法添加对应的函数和配置,这边注意,这里的id为自己定义的一个string,可以用来标记当前任务,对应于remove_job上参数,便于识别出是删除哪个任务。

scheduler.add_job(job, 'interval', seconds=5, id='timejob')scheduler.remove_job('timejob')

同时该对象还提供了以下的方法用于控制,分别要用于开始,暂停,重置和唤醒,关闭:

scheduler.start()
scheduler.pause()
scheduler.resume()
scheduler.wakeup()
scheduler.shutdown()

同时,已经创建好的任务也是可以用于修改的,对象提供了modify的方法:

job.modify(max_instance=10, name='Alternated name')

更多的使用方法,还是得自己去翻翻源码文档了。

        缺点

        ApScheduler 是一个功能强大的任务调度器,虽然在很多场景下表现优秀,但也存在一些缺点,例如:
        资源消耗:ApScheduler 在运行时会占用一定的系统资源,如内存和 CPU。特别是在调度大量任务时,可能会对系统性能产生显著影响。
        复杂性:ApScheduler 的功能丰富,配置选项繁多,使得在使用和学习过程中需要花费一定的时间来理解和掌握。
        稳定性:虽然 ApScheduler 的可靠性很高,但在某些特殊情况下,如并发操作、异常处理等方面,仍然可能出现错误或崩溃现象。
        可扩展性:ApScheduler 的扩展性有限,主要体现在任务调度器的插件和扩展功能上。如果你需要根据特定需求定制调度器,可能需要花费较多时间来开发和集成。
        文档更新:ApScheduler 的文档更新速度相对较慢,有时可能会跟不上新版本的变化。在使用过程中,你可能需要查阅社区资源或者源代码来获取最新的信息。

总结

        单纯从使用角度来看,要求精度不高,任务调度复杂度不高的情况下,直接使用schedule库是最为方便的。但是如果要执行复杂任务,带依赖的任务之类的问题的话,还是得使用APScheduler库。当然,对应的设置也比较复杂,使用友好度没有那么高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计讯物联网关型水利遥测终端机TY910确保闸站自动化监测长效运行

闸站是我国水利建设工程的重要组成部分,具备调度水源、防洪排涝、灌溉等能力,在农业、水路运输、养殖业等行业领域起着关键作用,进而解决区域水资源不均衡的问题,促进水资源多方面的利用。当前,我国闸站存在数量多、分…

线性代数 4 every one(线性代数学习资源分享)

Linear Algebra 4 Every One 版权说明,以下我分享的都是一个名叫Kenji Hiranabe的日本学者,在github上分享的,关于Gilbert Strang教授所撰写的《Linear Algebra for Everyone》一书的总结,更像是一个非常精美的线性代数手册&#…

ffmpeg命令行log的使用参数使用

1、使用report参数将log保存在文件中,但是这个命令参数需要和环境变量FFREPORT配合使用。 FFREPORTfilelog.txt:level100 ffmpeg -report -codec:v h264 -i .\zzsin_1280x720_30fps_60f.mp4 -frames:v 1 test.yuv该命令就可以将ffmpeg的log保存在文件log.txt中 …

.net core 2.1 简单部署IIS运行

netcore的项目不像netFramework那么方便部署到iis还是要费点功夫的 比如我想把这个netcore2.1的项目部署到iis并运行: 按照步骤走: 一、确认自己的netcore环境 1、需要安装下面3个环境包(如果电脑已安装请忽略) 检查是否安装cmd命令:cmd&…

《银行法律法规》三、银行管理——2、商业银行资产负债管理

第三章 商业银行资产负债管理 第一节 资产负债管理概述 考点1 资产负债管理的对象★★ 对于商业银行而言, 传统资产负债管理的对象即是银行的资产负债表。 传统资产负债管理的内涵是:根据外部形势变化及发展战略要求, 以资本约束为核心&#xff0c…

go mod vendor简明介绍

Go 语言在 go 1.6 版本以后编译 go 代码会优先从 vendor 目录先寻找依赖包,它具有以下优点: 复制依赖:go mod vendor 会把程序所依赖的所有包复制到项目目录下的vendor 文件夹中,所以即使这些依赖包在外部源(如 GitHu…

OpenCV中掩膜(Mask)、setTo()、copyTo()、clone()、inRange()的定义与使用

文章目录 1、掩膜(Mask)是什么(1)从物理的角度来看:(2)图像处理中的掩膜Mask(3)掩膜的用法:(4)掩膜Mask 的运算: 2、setTo()函数:将图…

flutter开发实战-dio文件下载实现

flutter开发实战-dio文件下载实现 在开发中,需要下载文件,这里使用的是dio dio 是一个强大的 Dart HTTP 请求库,支持全局配置、Restful API、FormData、拦截器、 请求取消、Cookie 管理、文件上传/下载、超时以及自定义适配器等。 一、引入d…

QGraphicsDropShadowEffect的介绍

QGraphicsDropShadowEffect的介绍 QGraphicsDropShadowEffect是Qt中一个用于添加阴影效果的图形特效类,可以在图形或控件周围添加一层阴影效果。通过调整阴影的偏移、模糊度、颜色等参数,可以实现各种独特的视觉效果。 基本用法 添加阴影 首先&#…

JS脚本 - 批量给所有指定标签追加Class属性

JS脚本 - 批量给所有指定标签追加Class属性 前言一. 脚本二. 测试运行 前言 公司里我们有个应用引入了UBT埋点,记录了页面上所有的点击操作以及对应的点击按钮。但是我们看下来发现,我们需要给每个按钮加一个唯一标识做区分,并且这个ID是给U…

自动驾驶遥控泊车RPA系统功能规范

目 录 1. 版本履历... 4 2. 文档使用范围... 4 3. 术语缩写... 4 4. 系统概述... 5 4.1 系统功能说明... 5 4.2 泊车状态说明... 6 5. 产品基本参数... 6 5.1控制器基本参数... 6 5.2全景摄像头基本参数... 7 5.3 超声波传感器基本参数... 7 …

Flask 使用Flask的session来保存用户登录状态例子

使用Python的Flask库实现的登录接口、查询金额接口和注销接口的示例。 当用户发送POST请求到/login接口时,代码会获取请求中的用户名和密码。如果用户名和密码匹配(在示例中是admin和admin123),则会将用户名保存在session中&…

docker命令

查看运行的容器:Docker ps 查看镜像:Docker images 停止容器运行:Docker stop 容器id 删除容器:docker rm 容器id 删除镜像:docker rmi 镜像id 镜像保存下来:docker save -o filename.tar 镜像仓库名称…

php判断是ios手机还是安卓手机

可以使用PHP中的$_SERVER[HTTP_USER_AGENT]全局变量来判断用户的设备类型。根据不同的设备类型&#xff0c;可以判断是iOS手机还是安卓手机。 下面是一个示例代码&#xff1a; <?phpfunction getUserAgent(){$user_agent $_SERVER[HTTP_USER_AGENT]; // 判断是否为iOS设备…

吴恩达机器学习2022-Jupyter特征缩放

1可选实验室: 特征缩放和学习率(多变量) 1.1 目标 在这个实验室里: 利用前一实验室开发的多变量线性回归模型程序在具有多种功能的数据集上运行梯度下降法探讨学习速度 alpha 对梯度下降法的影响通过使用 z 分数标准化的特征缩放来提高梯度下降法的性能 1.2 工具 您将使用…

Python爬虫学习笔记(三)————urllib

目录 1.使用urllib来获取百度首页的源码 2.下载网页图片视频 3.总结-1 4.请求对象的定制&#xff08;解决第一种反爬&#xff09; 5.编解码 &#xff08;1&#xff09;get请求方式&#xff1a;urllib.parse.quote&#xff08;&#xff09; &#xff08;2&#xff09;get请求…

RPC分布式网络通信框架(三)—— 服务配置中心Zookeeper模块

文章目录 一、使用Zookeeper的意义二、Zookeeper基础1 文件系统2 通知机制3 原生zkclient API存在的问题4 服务配置中心Zookeeper模块 三、Zk类实现Start方法创建节点、get节点值方法 四、框架应用rpc提供端框架rpc调用端&#xff08;客户端&#xff09;框架 总结 一、使用Zook…

flutter开发实战-生日等日期选择器DatePicker

flutter开发实战-生日等日期选择器DatePicker 在开发遇到设置生日等信息需要选择日期&#xff0c;这里用到的是CupertinoDatePicker iOS效果的日期、时间选择器 一、效果图 运行后效果图如下 二、代码实现 我们需要调用底部弹窗显示 //显示底部弹窗static void bottomShe…

kubernetes安全机制

//机制说明 Kubernetes 作为一个分布式集群的管理工具&#xff0c;保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介&#xff0c; 也是外部控制的入口。所以 Kubernetes 的安全机制基本就是围绕保护 API Server 来设计的。 比如 kubectl 如果想向…

Python实现PSO粒子群优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法&#xff08;Particle Swarm Optimization&#xff09;的英文缩写&#xff0c;是一…