当前位置: 首页 > news >正文

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()会阻塞程序的执行,因此在这个例子中,除了定时任务外,程序不会执行任何其他操作。如果需要同时执行其他任务,就需要考虑使用更为灵活的定时任务库,如scheduleAPScheduler

二、使用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中…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂&#xff…...

数据链路层的主要功能是什么

数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...