如何在Python中执行线程定时器

简介: 本文介绍了如何在Python中使用线程定时器,探讨了线程的基本概念及其优势。线程允许任务并发执行,通过任务切换技术实现多任务的“并行”运行。文章重点讲解了Python的`Timer`类,用于在指定时间后执行代码,并提供了实例演示其用法,如使用`cancel()`方法终止定时器。此外,还介绍了线程模块的功能、创建定时器类的方法以及与Python装饰器的结合应用。最后总结了线程的重要性及其实现技巧。

如何在Python中执行线程定时器

线程允许多个任务同时运行。例如,当任务A正在运行时,我不必等待它完成。同时,任务BC也会运行。当任务同时运行时,它们需要多个CPU。

为了并发地运行线程,Python使用了一种被称为任务切换的技术。结果是,Python在每个任务之间快速切换。使得它看起来像是多个任务在并行运行,使得它在事件驱动的任务中很有用。线程是轻量级的,它需要更少的内存,从而节省CPU资源。

如何在Python中执行线程定时器

一个线程有一个入口,一个执行点和一个退出点。Python库包含一个定时器,它是**"线程 "**类的一个子类,用于在限定的时间内执行代码。

Python中的线程 Timer()在定义为参数的延迟后开始。因此,定时器类调用自己,使下面的操作延迟执行,延迟的时间与指定的时间相同。

先决条件

要想继续学习,读者需要具备以下条件。

  • 一些Python的基础知识。

Python定时器函数

每隔指定的秒数后,就会调用一个定时器类的函数。start()是一个用于初始化定时器的函数。要结束或退出定时器,必须使用cancel()函数。为了使用线程类,导入线程类是必要的。使用函数time.sleep(secs)可以使调用的线程暂停数秒。

  • 为了更好地理解这一点,我将用一个代码片断和预期的输出截图来说明它。

实例1

py

代码解读

复制代码

## How class threading.Timer() in python works  
import threading as th  
## Defining a method  
def sctn():  
   print("SECTION FOR LIFE \n")  
S = th.Timer(5.0, sctn)  
S.start()  
print("Exit Program\n")
  • 代码运行后,需要5分钟才能显示SECTION FOR LIFE

实例2

在第二个例子中,我将向你展示如何实现暂停方法cancel() ,我们在前面已经看到它是为了结束一个线程。

py

代码解读

复制代码

##Illustrating the use of cancel() method in class Timer.  
import threading as th  
## Defining of a method  
def sctn():  
    print("SECTION FOR LIFE \n")  
S = th.Timer(5.0, sctn)  
S.start()  
print("PROGRAM TERMINATION\n")  
S.cancel()
  • 当程序被执行时,显示的是PROGRAM TERMINATION一行。这是因为对象th.Timer在执行**"sctn "**函数之前就被取消了。
  • 下面是上述程序的输出。

线程模块概述

最新的线程模块包含在当前的Python 2.4中,与之前的线程模块相比,它对线程提供了更强大、更高级别的支持。

线程模块暴露了线程模块的所有方法,并提供了一些额外的功能,如下图所示。

bash

代码解读

复制代码

  thread.activeCount() − Returns how many thread objects are active.
  thread.currentThread() − Returns how many thread objects in the caller's thread control.
  thread.enumerate() − Returns an overview list of all thread objects that are currently active.

创建和使用定时器类

线程的美妙之处在于,你可以告诉计算机在其他时间执行一项任务,或者同时进行。你还可以在不同的线程上同时执行代码,这使它变得非常强大。一个定时器类总是以间隔方式运行。

Python Timer 类用于执行一个操作或在指定的时间段过后让一个函数运行。线程类有一个子类,叫做类Timer。从技术角度讲,当我们需要有时间限制的操作(方法)时,我们将创建Timer对象。

要使用Timer类,我们首先要导入时间模块。args参数总是最好用来声明要调用的函数的参数。

py

代码解读

复制代码

##Timers  
##Execute code at timed intervals  
##Imports and Displays  
import time  
from threading import Timer  
def display(msg):  
    print(msg + ' ' + time.strftime('%H:%M:%S'))  
  
##Basic timer  
def run_once():  
    display('run_once:')  
    t=Timer(10,display,['Timeout:'])  
    t.start()#Here run is called  
run_once()  
##Runs immediately and once  
print('Waiting.....')  
  
##Lets make our timer run in intervals  
##Put it into a class  
##Making it run until we stop it  
##Just getting crazy.Notice We have multiple timers at once!  
class RepeatTimer(Timer):  
    def run(self):  
        while not self.finished.wait(self.interval):  
            self.function(*self.args,**self.kwargs)  
            print(' ')  
##We are now creating a thread timer and controling it  
timer = RepeatTimer(1,display,['Repeating'])  
timer.start() #recalling run  
print('Threading started')  
time.sleep(10)#It gets suspended for the given number of seconds  
print('Threading finishing')  
timer.cancel()
  • 下面是输出结果。

与Python装饰器一起工作

在使用Python装饰器工作时,将知道如何扩展Python Timer以使其被重复使用。使用装饰器的重要性在于,它只被实现一次,而函数每次都被计时。

  • 首先,我们将让Python定时器在装饰函数之前被调用,在调用结束后,终止Python定时器。

py

代码解读

复制代码

import functools  
import time  
  
 def timer(meth):  
    @functools.wraps(meth)  
    def timer_container(*args, **kwargs):  
        click = time.flow()  
        value: object = meth(*args, **kwargs)  
        clock = time.flow()  
        time_passed = click - clock ##getting the time spent
        print(f"TIME PASSED IS: {time_passed:0.2f} SECS")  ##displaying time passed to 2 decimal places
        return value  
  
    return timer_container()

当代码运行时,输出应该是。

bash

代码解读

复制代码

TIME PASSED IS: 0.59 SECS

使用线程的重要性

  • 线程可以并发操作,多线程程序可以在有多个CPU的计算机系统上运行得更快。
  • 一个程序可以继续对输入作出反应。这在单个CPU以及多个CPU上都是如此。
  • 一个进程中的线程可以共享全局变量内存。当一个全局变量在一个线程中被修改时,它会影响到所有线程。本地变量也可以存在于一个线程中。
  • 在操作系统中处理线程比处理进程要容易。因此,它们有时被称为轻量级进程。
  • 它可以被中断,因此允许高优先级的进程。
  • 它可以在其他线程运行时暂时搁置(有时被称为睡眠模式)--这被称为屈服

总结

在这篇文章中,我们已经学到了以下内容。

  1. Python定时器函数。如何使用诸如cancel()这样的函数来停止执行,甚至在它开始之前。
  2. 创建和使用定时器类。计时器类是线程类的一个子类。
  3. 使用Python装饰器。装饰器只用一次,但函数会被不断地计时。


转载来源:https://juejin.cn/post/7168734908423077918

目录
打赏
0
60
60
0
191
分享
相关文章
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
474 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
5月前
|
python3多线程中使用线程睡眠
本文详细介绍了Python3多线程编程中使用线程睡眠的基本方法和应用场景。通过 `time.sleep()`函数,可以使线程暂停执行一段指定的时间,从而控制线程的执行节奏。通过实际示例演示了如何在多线程中使用线程睡眠来实现计数器和下载器功能。希望本文能帮助您更好地理解和应用Python多线程编程,提高程序的并发能力和执行效率。
129 20
Python爬虫实战:利用短效代理IP爬取京东母婴纸尿裤数据,多线程池并行处理方案详解
本文分享了一套结合青果网络短效代理IP和多线程池技术的电商数据爬取方案,针对京东母婴纸尿裤类目商品信息进行高效采集。通过动态代理IP规避访问限制,利用多线程提升抓取效率,同时确保数据采集的安全性和合法性。方案详细介绍了爬虫开发步骤、网页结构分析及代码实现,适用于大规模电商数据采集场景。
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
167 0
Python中的多线程编程及其在数据处理中的应用
本文深入探讨了Python中多线程编程的概念、原理和实现方法,并详细介绍了其在数据处理领域的应用。通过对比单线程与多线程的性能差异,展示了多线程编程在提升程序运行效率方面的显著优势。文章还提供了实际案例,帮助读者更好地理解和掌握多线程编程技术。
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
python中的线程和进程(一文带你了解)
欢迎来到瑞雨溪的博客,这里是一位热爱JavaScript和Vue的大一学生分享技术心得的地方。如果你从我的文章中有所收获,欢迎关注我,我将持续更新更多优质内容,你的支持是我前进的动力!🎉🎉🎉
98 0
爬取小说资源的Python实践:从单线程到多线程的效率飞跃
本文介绍了一种使用Python从笔趣阁网站爬取小说内容的方法,并通过引入多线程技术大幅提高了下载效率。文章首先概述了环境准备,包括所需安装的库,然后详细描述了爬虫程序的设计与实现过程,包括发送HTTP请求、解析HTML文档、提取章节链接及多线程下载等步骤。最后,强调了性能优化的重要性,并提醒读者遵守相关法律法规。
217 0
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
144 3
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问