Python实现定时任务的方式
大家好,在当今数字化的时代,定时任务的需求在各种应用场景中频繁出现。无论是数据的定时更新、周期性的任务执行,还是特定时间点的操作触发,Python 都为我们提供了强大而灵活的手段来实现这些定时任务。当我们深入探索 Python 的世界时,会惊喜地发现多种巧妙的方式能够让我们精准地掌控时间,达成各种定时需求。在接下来的文章中,我们将一同揭开 Python 定时任务实现方式的神秘面纱,探寻其背后的精彩与奥秘。
一、使用time.sleep()函数
使用time.sleep()
函数是一种简单的实现定时任务的方式,尽管它并不是真正意义上的定时任务。该函数可以让程序在执行到该语句时暂停一段时间,从而实现在指定的时间间隔后执行下一步操作。但需要注意的是,time.sleep()
会阻塞程序的执行,意味着在等待的过程中,程序无法同时执行其他任务,这在一些情况下可能会造成问题。
下面是一个简单的示例,演示如何使用time.sleep()
函数实现定时任务:
import timedef my_task():print("定时任务执行中...")# 这里放置你想要定时执行的任务代码def main():while True:my_task()# 暂停10秒钟后再次执行任务time.sleep(10)if __name__ == "__main__":main()
在这个示例中,my_task()
函数定义了我们想要定时执行的任务。在main()
函数中,通过一个无限循环来反复执行my_task()
函数,并在每次执行后暂停10秒钟。这样就实现了每隔10秒执行一次任务的效果。
然而,需要注意的是,由于time.sleep()
会阻塞程序的执行,因此在这个例子中,除了定时任务外,程序不会执行任何其他操作。如果需要同时执行其他任务,就需要考虑使用更为灵活的定时任务库,如schedule
或APScheduler
。
二、使用threading.Timer
类
使用threading.Timer
类是一种更加灵活的实现定时任务的方式,它允许你在指定的时间后执行函数,而且不会阻塞程序的执行。通过创建一个Timer
对象,你可以设置定时器的间隔时间和要执行的函数,然后启动定时器,这样就可以实现定时执行任务的效果。
下面是一个示例,演示如何使用threading.Timer
类实现定时任务:
import threadingdef my_task():print("定时任务执行中...")# 这里放置你想要定时执行的任务代码def start_timer(interval):# 创建一个定时器对象,设置定时器的间隔时间和要执行的函数timer = threading.Timer(interval, my_task)# 启动定时器timer.start()if __name__ == "__main__":# 设置定时器的间隔时间(单位:秒)interval = 10# 启动定时器start_timer(interval)
在这个示例中,我们首先定义了一个my_task()
函数,它包含了我们想要定时执行的任务代码。然后定义了一个start_timer()
函数,用来创建和启动定时器。在start_timer()
函数中,我们通过threading.Timer(interval, my_task)
创建了一个定时器对象,指定了定时器的间隔时间为interval
秒,并设置要执行的函数为my_task()
。最后通过timer.start()
启动定时器。
这样,每隔interval
秒,定时器就会执行一次my_task()
函数,从而实现了定时执行任务的效果。与使用time.sleep()
不同的是,使用threading.Timer
类实现定时任务不会阻塞程序的执行,因此可以同时执行其他任务。
三、使用sched模块
使用Python标准库中的sched
模块是实现定时任务的另一种常见方式。sched
模块提供了一个事件调度器,可以用于调度在将来某个时间执行的任务。通过使用sched.scheduler
类,你可以创建一个调度器对象,并使用enter()
方法安排任务的执行。
下面是一个示例,演示如何使用sched
模块实现定时任务:
import sched
import time# 创建一个调度器对象
scheduler = sched.scheduler(time.time, time.sleep)def my_task():print("定时任务执行中...")# 这里放置你想要定时执行的任务代码def schedule_task(interval):# 设置任务的执行时间next_run_time = time.time() + interval# 安排任务的执行scheduler.enterabs(next_run_time, 1, my_task)print("定时任务已安排,下次执行时间为:", time.ctime(next_run_time))if __name__ == "__main__":# 设置定时任务的间隔时间(单位:秒)interval = 10# 安排第一次执行任务schedule_task(interval)# 开始调度器,持续执行已安排的任务scheduler.run()
在这个示例中,我们首先导入了sched
模块和time
模块。然后创建了一个调度器对象scheduler
,使用了sched.scheduler(time.time, time.sleep)
来初始化调度器对象,指定了时间函数和睡眠函数。接着定义了一个my_task()
函数,其中包含了我们想要定时执行的任务代码。然后定义了一个schedule_task()
函数,用于安排任务的执行。在schedule_task()
函数中,我们通过scheduler.enterabs(next_run_time, 1, my_task)
来安排任务的执行,指定了任务的执行时间、优先级和要执行的函数。最后,在if __name__ == "__main__":
中,我们设置了定时任务的间隔时间为interval
秒,并安排了第一次执行任务。然后通过scheduler.run()
开始调度器,使其持续执行已安排的任务。
这样,每隔interval
秒,调度器就会执行一次my_task()
函数,从而实现了定时执行任务的效果。
四、使用asyncio库
使用asyncio
库是在基于异步编程的项目中实现定时任务的一种有效方式。asyncio
库提供了异步编程的支持,允许你在程序中定义协程(coroutines),并使用async/await
关键字来管理异步任务的执行。
当需要在一段时间后执行某个任务时,你可以使用asyncio.sleep()
函数创建一个异步等待,然后在等待结束后执行相应的任务。
下面是一个示例,演示如何使用asyncio
库实现定时任务:
import asyncioasync def my_task():print("定时任务执行中...")# 这里放置你想要定时执行的任务代码async def schedule_task(interval):while True:# 等待一段时间后执行任务await asyncio.sleep(interval)# 执行任务await my_task()if __name__ == "__main__":# 设置定时任务的间隔时间(单位:秒)interval = 10# 创建事件循环对象loop = asyncio.get_event_loop()# 启动定时任务loop.create_task(schedule_task(interval))# 运行事件循环loop.run_forever()
在这个示例中,我们首先导入了asyncio
库。然后定义了一个my_task()
协程函数,其中包含了我们想要定时执行的任务代码。接着定义了一个schedule_task()
协程函数,用于实现定时任务的调度。在schedule_task()
函数中,我们使用asyncio.sleep(interval)
创建了一个异步等待,等待一段时间后执行任务。然后通过await my_task()
执行任务。最后,在if __name__ == "__main__":
中,我们设置了定时任务的间隔时间为interval
秒,并通过loop.create_task(schedule_task(interval))
启动定时任务。然后通过loop.run_forever()
运行事件循环,使定时任务持续执行。
这样,每隔interval
秒,就会执行一次定时任务。由于使用了asyncio
库,定时任务的执行是非阻塞的,因此可以与其他异步任务一起运行,提高了程序的并发性能。
五、使用schedule库
schedule
库提供了一个简单的API,可以方便地安排任务的执行。可以使用schedule.every().xxx
方法来设置定时任务的执行间隔和要执行的任务函数,然后调用schedule.run_pending()
方法来运行已安排的任务。
下面是一个示例,演示如何使用schedule
库实现定时任务:
import schedule
import timedef my_task():print("定时任务执行中...")# 这里放置你想要定时执行的任务代码if __name__ == "__main__":# 设置定时任务的间隔时间(单位:秒)interval = 10# 安排定时任务的执行schedule.every(interval).seconds.do(my_task)while True:# 运行已安排的任务schedule.run_pending()time.sleep(1)
在这个示例中,我们首先导入了schedule
库和time
模块。然后定义了一个my_task()
函数,其中包含了我们想要定时执行的任务代码。接着在if __name__ == "__main__":
中,我们设置了定时任务的间隔时间为interval
秒,并使用schedule.every(interval).seconds.do(my_task)
安排了定时任务的执行。最后通过schedule.run_pending()
运行已安排的任务。
六、使用APScheduler库
APScheduler
(Advanced Python Scheduler)库提供了更多高级功能,如支持不同的触发器(包括时间间隔触发器、定时触发器等)、持久化存储等。
下面是一个示例,演示如何使用APScheduler
库实现定时任务:
from apscheduler.schedulers.background import BackgroundSchedulerdef my_task():print("定时任务执行中...")# 这里放置你想要定时执行的任务代码if __name__ == "__main__":# 创建一个后台调度器scheduler = BackgroundScheduler()# 添加定时任务,设置定时触发器,间隔时间为10秒scheduler.add_job(my_task, 'interval', seconds=10)# 启动调度器scheduler.start()try:# 防止主线程结束while True:passexcept (KeyboardInterrupt, SystemExit):# 停止调度器scheduler.shutdown()
在这个示例中,我们首先导入了BackgroundScheduler
类。然后定义了一个my_task()
函数,其中包含了我们想要定时执行的任务代码。接着在if __name__ == "__main__":
中,我们创建了一个后台调度器scheduler
,并使用scheduler.add_job(my_task, 'interval', seconds=10)
添加了定时任务,设置了定时触发器,间隔时间为10秒。最后通过scheduler.start()
启动调度器,并在程序结束前调用scheduler.shutdown()
停止调度器。这样,定时任务就会在每隔10秒执行一次。
七、使用操作系统的调度工具
使用操作系统的调度工具,如cron(Linux/Unix系统)或Task Scheduler(Windows系统),是一种常见且有效的方式来执行定时任务。通过编写一个Python脚本,并在操作系统的调度工具中设置定时执行的时间和执行命令,可以轻松地实现定时任务的调度和管理。
1、使用cron(Linux系统):
cron是一个在Unix类操作系统中常用的计划任务程序,它允许用户在预定时间执行命令或脚本。你可以通过编辑crontab文件来设置定时执行的任务。
下面是一个示例,演示如何使用cron来执行Python脚本:
首先,编写一个Python脚本(例如my_script.py
):
# my_script.py
def my_task():print("定时任务执行中...")# 这里放置你想要定时执行的任务代码if __name__ == "__main__":my_task()
然后,在终端中编辑crontab文件,添加定时执行的任务:
$ crontab -e
在打开的编辑器中添加以下内容:
# 每天上午8点执行Python脚本
0 8 * * * /usr/bin/python3 /path/to/my_script.py
保存并关闭编辑器。这样,Python脚本my_script.py
就会每天上午8点执行一次。
2、使用Task Scheduler计划任务(Windows系统):
Task Scheduler是Windows系统中的一个任务计划程序,可以让你安排执行各种任务,包括运行程序、发送电子邮件等。
下面是一个示例,演示如何使用Task Scheduler来执行Python脚本:
首先,编写一个Python脚本(例如my_script.py
):
# my_script.py
def my_task():print("定时任务执行中...")# 这里放置你想要定时执行的任务代码if __name__ == "__main__":my_task()
然后,打开Task Scheduler并创建一个新的基本任务。在任务设置中,指定要运行的程序为Python解释器,并将Python脚本的路径作为参数传递给解释器。在触发器设置中,选择适当的触发器类型和执行时间。最后,设置完成后保存任务。这样,Python脚本my_script.py
就会在指定的时间执行。
相关文章:

Python实现定时任务的方式
大家好,在当今数字化的时代,定时任务的需求在各种应用场景中频繁出现。无论是数据的定时更新、周期性的任务执行,还是特定时间点的操作触发,Python 都为我们提供了强大而灵活的手段来实现这些定时任务。当我们深入探索 Python 的世…...

微信小程序-网络数据请求(配置request合法域名)
1.小程序中网络数据请求的限制 出于安全方面的考虑,小程序官方对数据接口的请求做出了如下两个限制: (1)只能请求HTTPS类型的接口 (2)必须将接口的域名添加到信任列表中 如果要请求某个域名下的接口&am…...

栈和队列题目练习
本节小编选了两道题来加深对栈和队列的认识理解! 有效的括号 方法1:直接用栈的结构(动态数组) 本题可以用栈这个结构来解答,将(,{,[ 左括号压入栈中,然后取出栈顶元素与右括号),},]匹配。不匹配的话&…...
【排列问题】
问题: 已知某序列有n个元素,请编写程序打印出包含该序列所有元素的所有排列。 输入要求: 输入第1行为整数n,表示该序列元素的个数;第2行为n个整数,表示需要排列的序列元素。 输出要求:输出若…...
token 无感刷新
什么是 token 无感刷新?为什么需要 token 无感刷新?让我们想象一下有这么个场景:你登录一个系统成功后,玩了 10 分钟,发现登录失效了,又要你重新登录,然后又过 10 分钟,又失效了&…...

Netty SSL双向验证
Netty SSL双向验证 1. 环境说明2. 生成证书2.1. 创建根证书 密钥证书2.2. 生成请求证书密钥2.3. 生成csr请求证书2.4. ca证书对server.csr、client.csr签发生成x509证书2.5. 请求证书PKCS#8编码2.6. 输出文件 3. Java代码3.1. Server端3.2. Client端3.3. 证书存放 4. 运行效果4…...
4.nginx反向代理、负载均衡
nginx反向代理、负载均衡 一、反向代理1、语法2、注意事项3、后端服务器记录客户端真实IP3.1 在nginx反向代理时添加x-real-ip字段3.2 后端httpd修改combined日志格式3.3 后端是nginx的情况 二、负载均衡 upstream模块1、负载均衡作用2、调度算法3、配置应用 一、反向代理 隐藏…...

浅谈申请小程序地理位置权限的正确打开方式
小程序地理位置接口有什么功能? 这篇内容会教大家如何快速申请“获取当前的地理位置(onLocationChange)”接口,以便帮助大家顺利开通接口。以下内容是本人经历了多次的申请经历得出来的经验,来之不易,望大家…...
make modules 和 make modules_install
1. make modules 如:make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- modules 直接make,不加任何参数,就是make all,包含make modules。 make modules是单独编译模块,驱动被配置成M的都是modules,modul…...

docker 安装mysql,redis,rabbitmq
文章目录 docker 安装ngnix,mysql,redis,rabbitmq安装docker1.安装下载docker-ce源命令2.安装docker3.查看版本4.查看docker状态5.启动docker6.测试安装ngnix 安装mysql8.0.361.拉取mysql镜像2.安装mysql8 安装redis1.拉取redis7.0.11镜像2.安装redis3.进入容器内部…...

Windows配置java环境JDK
配置jdk环境非常简单,大概有以下几步: 下载jdk安装,然后双击进行安装配置环境变量(也不是一定非要配置环境变量,配置环境变量的好处就是,在任何位置,系统都可以找到安装路径,非常实用且方便) …...
英伟达驱动重装教程
离线安装NVIDIA驱动程序通常涉及下载驱动程序安装包并手动执行安装步骤。以下是详细步骤: 1. 下载NVIDIA驱动程序 首先,你需要在有网络连接的计算机上下载适合你系统的NVIDIA驱动程序安装包。可以从NVIDIA官方驱动下载页面下载。 选择你的GPU型号和操作系统,然后下载相应…...

【蓝桥杯嵌入式】 第六届国赛
目录 题目 配置 注意事项 代码 - 默写大师 EEPROM读写函数 LED驱动函数 ADC采集 上电初始化 LCD 按键 PWM互补输出 全部代码 hardware.c hardware.h control.c control.h main.c 题目 配置 注意事项 复制LCD的工程,先配置资源 --- 勾选完选项一…...

图片裁剪与上传处理方案 —— 基于阿里云 OSS 处理用户资料
目录 01: 通用组件:input 构建方案分析 02: 通用组件:input 构建方案 03: 构建用户资料基础样式 04: 用户基本资料修改方案 05: 处理不保存时的同步问题 06: 头像修改方案流程分析 07: 通用组件:Dialog 构建方案分析 08: 通用组件&…...

迷你主机Esxi 6.7挂载新硬盘
背景 硬件:零刻SER Pro 6 系统:vmware Exsi 6.7.0 Update 3 现有的硬盘槽位占满了,但空间不够用,想要通过USB外接移动硬盘来进行扩容。使用了一块250G的硬盘做测试。 步骤 TL;DR # 停止usbarbitrator服务 /etc/init.d/usbarbi…...

解决VSCode右键没有Open In Default Browser问题
在VSCode进行Web小程序测试时,我们在新建的HTML文件中输入 !会自动生成页面代码骨架,写入内容后,我们想要右键在浏览器中预览。发现右键没有“Open In Default Browser”选项。原因是没有安装插件。 下面是解决方案:首先在VSCode找…...

httpsok-v1.12.0支持LB证书自动部署
🔥httpsok-v1.12.0支持LB证书自动部署 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具,基于全新的设计理念,专为 Nginx 、OpenResty 服务器设计。已服务众多中小企业,稳定、安全、可靠。 一行命令,一分钟轻松搞…...

基于Pytorch框架的深度学习EfficientNetV2神经网络中草药识别分类系统源码
第一步:准备数据 5种中草药数据:self.class_indict ["百合", "党参", "山魈", "枸杞", "槐花", "金银花"] ,总共有900张图片,每个文件夹单独放一种数据 第二步&a…...

网络协议。
一、流程案例 接下来揭秘我要说的大事情,“双十一”。这和我们要讲的网络协议有什么关系呢? 在经济学领域,有个伦纳德里德(Leonard E. Read)创作的《铅笔的故事》。这个故事通过一个铅笔的诞生过程,来讲述…...

Excel单元格格式无法修改的原因与解决方法
Excel单元格格式无法更改可能由多种原因造成。以下是一些可能的原因及相应的解决方法: 单元格或工作表被保护: 如果单元格或工作表被设置为只读或保护状态,您将无法更改其中的格式。解决方法:取消单元格或工作表的保护。在Excel中…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...