Python实现定时器的几种方式(超详细)

✨前言:

在Python编程中,定时器是一种非常有用的工具,用于执行特定任务或函数,例如定时任务、轮询操作、定时检查等。Python提供了多种方式来创建和使用定时器,本文将介绍一些高级的定时器使用方式,包括使用threading模块、使用schedule库以及在异步编程中使用定时器。

👉1 使用time.sleep()结合循环

这是最基础的计时方法,通过让程序暂停一定时间来实现简单的定时任务。

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/26
# @Author  : Summer
# @File    : test
# @describe:
"""

import time


def task():
    print("任务执行中...")


interval = 5  # 间隔5秒

while True:
    task()
    time.sleep(interval)

👉2.使用threading.Timer

threading.Timer是Python标准库threading中的一个类,用于在指定时间后启动一个任务。它主要用于简单的延迟任务执行,适合于不需要复杂调度逻辑的场景。其使用相对简单,但在处理复杂的调度任务时可能会显得力不从心。
常用场景
延迟执行任务:在需要任务延迟一段时间执行时,如启动延迟、简单重试机制等。
单次定时任务:适合于只需要执行一次的定时任务。
常用方法
创建和启动定时器:

import threading

def my_task():
    print("My Task Executing")

timer = threading.Timer(10, my_task)  # 10秒后执行my_task
timer.start()

取消定时器: 如果定时器尚未执行,可以使用cancel()方法取消。

timer.cancel()

👉3 使用sched模块

sched模块是Python自带的一个事件调度模块,它提供了一个通用的方法来定时运行任务。

3.1 enter

enter(delay, priority, action, argument=(), kwargs={})
这个方法用于调度一个事件。事件将会在指定的延迟时间delay后被执行。priority参数用于同一时间到达的两个事件进行排序:具有较小priority值的事件会被先执行。action参数则是当事件被执行时会调用的函数,argument是传递给action的参数组成的元组,kwargs是传递给action的关键字参数组成的字典。
调用enter方法会返回一个事件对象,这个对象可以用于后续取消该事件。

3.2 cancel(evt)

cancel(event)
此方法用于取消一个已经被安排的事件。要取消一个事件,你需要传递给cancel方法之前调用enter方法时返回的事件对象。一旦取消,该事件就不会执行。
如果尝试取消一个不存在或已经执行的事件,则会抛出一个ValueError异常。

3.3 empty

empty()
这个方法用于检查调度器队列中是否有待执行的事件。如果事件队列为空,它返回True,否则返回False。

没有事件等待执行通常意味着调度器的run方法将立即返回,因为它没有任何工作可做。

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/26
# @Author  : Summer
# @File    : test
# @describe:
"""

import sched
import time
from datetime import datetime

# 初始化sched模块的scheduler类
schedule = sched.scheduler(time.time, time.sleep)


def task(inc):
    now = datetime.now()
    ts = now.strftime("%Y-%m-%d %H:%M:%S")
    print("Task executed at:", ts)
    # 这里安排下一次执行的任务
    evt = schedule.enter(inc, 0, task, (inc,))

    # 假设我们在这里确定了需要取消未来某个计划任务的条件
    # 这里仅为示例,实际情况下应依据具体逻辑
    if datetime.now().second % 10 == 0:  # 假设当当前秒数是10的倍数时取消后续任务
        print("Cancelling the future task.")
        schedule.cancel(evt)  # 取消未来的任务


def func(inc=5):
    # 调度第一次执行任务
    schedule.enter(0, 0, task, (inc,))
    schedule.run()


func()

# 示例结束后,检查调度器队列是否为空
if schedule.empty():
    print("Scheduler queue is empty. No more tasks to run.")

在上面的例子中,我们调度了两个事件,但在事件真正开始之前我们取消了第一个事件。然后我们检查了调度器队列是否为空,这将决定是否有更多的工作需要执行。请注意,cancel的调用应该在run方法调用之前,以便正确地取消事件。在run之后调用cancel将没有任何效果,因为此时事件可能已经执行完毕。

👉4 使用APScheduler

APScheduler是一个Python库,用于开发复杂的任务调度。与threading.Timer相比,APScheduler提供了丰富的功能,如任务持久化、作业存储选择、多种触发条件等,更适合于需要复杂调度策略的应用。
常用场景
周期性任务调度:例如,定时进行数据库的备份、定期清理日志文件等。
动态任务调度:可以根据运行时的情况动态地添加、修改或删除任务。
多种调度策略:支持定点、定时、间隔、cron等多种调度方式。
常用方法
初始化调度器:选择合适的调度器,如阻塞、后台等。

from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()

添加作业:根据需要选择作业的执行周期,配置作业。

def my_task():
    print("My Task Executing")

# 按间隔时间执行
scheduler.add_job(my_task, 'interval', minutes=10)

# 使用cron表达式执行
scheduler.add_job(my_task, 'cron', day_of_week='mon-fri', hour=6)

启动、关闭调度器:

scheduler.start()  # 启动调度器

# 如需关闭调度器
scheduler.shutdown()

作业的暂停、恢复和移除:

job = scheduler.add_job(my_task, 'interval', hours=2)
job.pause()  # 暂停作业
job.resume()  # 恢复作业
job.remove()  # 移除作业

👉5 使用timeit模块

主要用于测量小段代码的执行时间,虽然不是用来作为定时器,但在某些情况下可以用来作为计时工具。

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/26
# @Author  : Summer
# @File    : test
# @describe:
"""

import timeit


def task():
    print("任务执行中...")


# timeit默认执行1000000次,这里设置number=1做演示
timeit.timeit(task, number=1)

👉6 使用asyncio

在Python3.4以上版本中,可以使用asyncio实现异步的定时器。

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/26
# @Author  : Summer
# @File    : test
# @describe:
"""

import asyncio


async def task():
    print("任务执行中...")


async def main():
    while True:
        await task()
        await asyncio.sleep(5)

asyncio.run(main())

👉7 Celery

Celery是一个强大的分布式任务队列系统,允许你在一个或多个工作节点上执行异步和定时任务。它支持多种消息代理作为任务队列的后端,如RabbitMQ、Redis等。

常用场景
分布式系统中的异步任务处理:例如,在Web应用中异步发送电子邮件、生成报表等。
周期性任务调度:利用Celery Beat,可以很方便地实现周期性任务的调度,如每天清理数据库、定时抓取数据等。
执行周期性任务(结合Celery Beat):

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/4/26
# @Author  : Summer
# @File    : test
# @describe:
"""

from celery import Celery
from datetime import timedelta

app = Celery('tasks', broker='redis://localhost:6379/0')


@app.task
def my_task(arg):
    print(arg)


app.conf.beat_schedule = {
    'execute-my-task-every-10-seconds': {
        'task': 'my_task',
        'schedule': timedelta(seconds=10),
        'args': ("Periodic task executed",)
    },
}

📚 总结

定时器是Python编程中的一个重要工具,用于执行定时任务和操作。本文介绍了多种高级的定时器使用方式,包括使用 threading 模块、schedule 库以及在异步编程中使用定时器。选择合适的方法取决于具体需求和项目的要求。无论你选择哪种方式,希望本文提供的示例代码和说明能帮助大家更好地使用定时器来管理任务和操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据基础

基本简介 大数据特点 数据量大 种类多样 结构化:多指关系型数据库中,信用卡号码、日期、财务金额、电话号码、地址 半结构化:xml/json 非结构化:全文文本、图象、声音、影视、超媒体等信息。 应用价值高 大数据的作用 追溯…

protobuf协议逆向解析

protobuf协议逆向解析 地址: aHR0cHM6Ly93d3cudGlrdG9rLmNvbS9tZXNzYWdlcz9sYW5nPWVu找到接口/v2/message/get_by_user_init 如图所示, 参数和响应并不是可直接使用的, 虽然部分内容可读。 跟栈到这里, 找到封包前的数据 打上断点, 查看变量t就是请…

数字安全实操AG网址漏洞扫描原理与技术手段分析

在数字化世界的大舞台上,网络安全如同守护者一般,默默保卫着我们的虚拟疆界。当我们在享受互联网带来的便利时,一场无形的战争正在上演。黑客们利用各种手段试图攻破网站的安全防线,而防守方则依靠先进的技术和策略来抵御入侵。其…

武汉星起航:创新孵化模式,一站式服务助力卖家全球化拓展

在全球化浪潮席卷而来的今天,跨境电商行业已成为推动国际贸易的重要力量。武汉星起航电子商务有限公司,作为这一领域的佼佼者,以其前瞻性的战略眼光和创新的经营模式,积极践行“走出去”战略,凭借自营店铺运营经验和跨…

Golang | Leetcode Golang题解之第50题Pow(x,n)

题目: 题解: func myPow(x float64, n int) float64 {if n > 0 {return quickMul(x, n)}return 1.0 / quickMul(x, -n) }func quickMul(x float64, n int) float64 {if n 0 {return 1}y : quickMul(x, n/2)if n%2 0 {return y * y}return y * y * …

云赛道---深度学习

• 分析问题定位任务:首先定位问题,将实际问题转化为机器学习问题,需要什么样的 数据,然后进行数据的采集。包含数据探查、场景抽象、算法选择。比如逻辑回归可 以决定我们是不是能喝咖啡;那另外朴素贝叶斯算法可以用来区分垃圾…

Linux|Awk 变量、数字表达式和赋值运算符

引言 本部分[1]将深入学习 Awk 的高级应用,以应对更为复杂的文本或字符串过滤任务。将介绍包括变量、数值表达式和赋值运算符在内的 Awk 功能。 这些概念与你之前可能在诸如shell、C、Python等许多编程语言中接触过的概念并没有本质上的不同,所以你不必过…

SaaS云HIS平台源码 采用云部署模式,部署一套可支持多家医院共同使用

目录 云HIS门诊业务使用流程 云HIS住院业务使用流程 云HIS系统使用流程 云HIS优势 云HIS系统功能模块 医疗业务: 电子病历: 经济管理: 药物管理: 统计报表: 系统管理: 运营运维: 通…

NLP step by step -- 了解Transformer

Transformer模型 Transformer相关历史 首先我们先看一下有关Transformer模型的发展历史,下面的图是基于Transformer架构的一些关键模型节点: 图片来源于Hugging Face 图片来源于Hugging Face Transformer 架构 于 2017 年 6 月推出。原本研究的重点是…

deepin 亮相 Intel 合作伙伴交流会,展示AI大模型应用最新成果

内容来源:deepin 社区 2024 年 4 月 18 日,备受业界瞩目的 Intel Channel Partner Networking Fair 在香港天际万豪酒店隆重举办。 在这场行业盛会上,deepin(深度)受邀参与了 Intel Demo Showcase 环节,向…

JDBC查询大数据时怎么防止内存溢出-流式查询

文章目录 1.前言2.流式查询介绍3.使用流式查询3.1不开启流式查询的内存占用情况3.2开启流式查询的内存占用情况 4.开启流式查询的注意点 1.前言 在使用 JDBC 查询大数据时,由于 JDBC 默认将整个结果集加载到内存中,当查询结果集过大时,很容易…

python与pycharm如何设置文件夹为源代码根目录

相信大家遇到过下面这种情况 当我们在当前项目下引入了其它项目的代码,这是其它项目的包的导入路径是不用于当前项目的,这样导致项目无法正常起来,但是我们又不可能一个个文件去处理,这时可以用下面的方式解决 pycharm直接设置 …

Centos 5 的yum源

背景 有使用较老的Centos 5 系统内部安装软件无法正常报错,是由于系统叫老yum源存在问题 处理方法 更换下述yum源,可以将其他repo源文件备份移动到其他目录,添加下述源后重新测试 [C5.11-base] nameCentOS-5.11 baseurlhttp://vault.c…

非对称渐开线齿轮学习笔记分享

最近有小伙伴遇到了非对称渐开线齿轮的加工问题,花了些时间学习了解一下,下面是总结的学习笔记,有兴趣的朋友可以瞅瞅: 目录: 为什么要采用非对称? 非对称有什么优点? 非对称齿形如何加工? 非对称齿轮怎么测量? 非对称齿轮建模 为什么要采用非对称? 现在的传动要求…

【SSM进阶学习系列丨整合篇】Spring+SpringMVC+MyBatis 框架配置详解

文章目录 一、环境准备1.1、创建数据库和表1.2、导入框架依赖的jar包1.3、修改Maven的编译版本1.4、完善Maven目录1.5、编写项目需要的包1.6、编写实体、Mapper、Service 二、配置MyBatis环境2.1、配置mybatis的主配置文件2.2、编写映射文件2.3、测试环境是否正确 三、配置Spri…

streamlit data_editor学习之 LLM理论内存占用量计算器

streamlit data_editor学习之 LLM理论内存占用量计算器 一.效果二.代码三.运行命令四.参考链接 根据用户设置的LLM参数,计算设备内存的占用量。以web的形式方便共享,可以插入多条记录,表格更新后,可以动态计算结果 一.效果 二.代码 import streamlit as st #1.31.1 import cv…

【八股】Spring Boot

SpringBoot是如何实现自动装配的? 首先,SpringBoot的核心注解SpringBootApplication里面包含了三个注解,SpringBootConfigurationEnableAutoConfigurationComponentScan,其中EnableAutoConfiguration是实现自动装配的注解&#x…

如何最大程度使用AWS?

随着云计算技术的不断发展,AWS已经成为众多企业的首选,为其提供了强大的基础设施和服务。那么如何最大程度地、灵活地利用AWS,成为许多企业专注的焦点。九河云作为AWS的合作伙伴,为读者们提供一些技巧和策略,帮助读者充…

UL认证防逆流多功能监测装置AGF-AE-D

安科瑞薛瑶瑶18701709087/17343930412 在单逆变器系统中,仪表直接与逆变器相连。如果您的变频器有一个内置的收入等级表(RGM;该变频器 被称为收入等级变频器),您可以在 RGM 的同一总线上连接一个外部仪表。

【React】Sigma.js框架网络图-入门篇(2)

通过《【React】Sigma.js框架网络图-入门篇》有了基本认识 由于上一篇直接给出了基本代码示例,可能看着比较复杂也不知道是啥意思; 今天从理论入手重新认识下! 一、基本认识 首先,我们先了解下基础术语: 图(Graph)&…