python线程threading.Timer源码解读

threading.Timer的作用

官方给的定义是:

"""Call a function after a specified number of seconds:

        t = Timer(30.0, f, args=None, kwargs=None)        t.start()        t.cancel()     # stop the timer‘s action if it‘s still waiting

"""

意思是:

  在一个特定的秒数之后调用一个函数,使用方法是创建一个Timer实例,然后start()启动线程,如果在线程调用传入的函数之前可以使用cancel进行取消。

threading.Timer源码分析

 1 class Timer(Thread):  # 继承自Thread类
 2     """Call a function after a specified number of seconds:
 3
 4             t = Timer(30.0, f, args=None, kwargs=None)
 5             t.start()
 6             t.cancel()     # stop the timer‘s action if it‘s still waiting
 7
 8     """
 9
10     def __init__(self, interval, function, args=None, kwargs=None):  # 初始化的时候传参是延迟时间、调用的函数,函数的可变位置参数、函数的可变关键字参数
11         Thread.__init__(self)  # 调用Thread类初始化配置实例
12         self.interval = interval  # 在使用Thread类初始化配置实例之后再额外的增加interval属性
13         self.function = function  # 同理再额外的增加function属性
14         self.args = args if args is not None else []   # 如果args不是空的话就使用args,如果是空就给一个空list
15         self.kwargs = kwargs if kwargs is not None else {}  # 同理,kwargs不是空的就是kwargs,如果是空就给一个空字典
16         self.finished = Event()  # 再添加一个属性finished,是一个Event类的实例,这里知道Event类的实例用法就知道它在这里要怎么用了
17
18     def cancel(self):       """如果finished属性还没有被set,即函数function还没有被调用的之前阻止,因为下面函数调用之前会判断finished是否被set了,所以这里赶在调用之前注定set就能够阻止后面的调用。"""
19         """Stop the timer if it hasn‘t finished yet."""
20         self.finished.set()
21
22     def run(self):  # 继承自Thread类,并且重写了Thread类,我们分析Thread类的源码会发现,start()方法会主动调用self.run(),              # 我们Timer类没有实现start()方法,这样Timer类实例在执行start()的时候会跑到父类Thread上,然后调用父类的start,              # 在父类的start()方法中会有一句self.run()来调用工作线程中的函数,这里self是Timer的实例,所以,这里可以重写run就可以设定run的时间了。
23         self.finished.wait(self.interval)  # 这里使用Event类的实例的wait方法,等待了我们设定的self.interval时间,然后关键点是下面一句
24         if not self.finished.is_set():  # 这一句是关键点,检查一下是否被set了,如果没有被set了就调用传入的函数,如果被set了有两种情况:                          # 第一种情况是在self.finished.wait(self.interval)的期间,我们调用cancel主动提前set了;                                           # 第二种情况是已经start()过一次了,这里就不能再进行start了这样就和父类的保持了一致:即一个线程只能够start一次
25             self.function(*self.args, **self.kwargs)
26         self.finished.set()  # 调用完成后set,即便之前已经被set了,这里还可以被set,因为Event实例可以被set多次。

原文地址:https://www.cnblogs.com/duanming/p/11830728.html

时间: 2024-10-07 07:08:38

python线程threading.Timer源码解读的相关文章

python语言线程标准库threading.local源码解读

本段源码可以学习的地方: 1. 考虑到效率问题,可以通过上下文的机制,在属性被访问的时候临时构建: 2. 可以重写一些魔术方法,比如 __new__ 方法,在调用 object.__new__(cls) 前后进行属性的一些小设置: 3. 在本库中使用的重写魔术方法,上下文这两种基础之上,我们可以想到函数装饰器,类装饰器,异常捕获,以及两种上下文的结构: 灵活运用这些手法,可以让我们在代码架构上更上一层,能够更加省时省力. 1 from weakref import ref # ref用在了构造大

线程池ThreadPoolExecutor源码解读研究(JDK1.8)

一.什么是线程池 为什么要使用线程池?在多线程并发开发中,线程的数量较多,且每个线程执行一定的时间后就结束了,下一个线程任务到来还需要重新创建线程,这样线程数量特别庞大的时候,频繁的创建线程和销毁线程需要一定时间而且增加系统的额外开销.基于这样的场景,线程池就出现了,线程池可以做到一个线程的任务处理完可以接受下一个任务,并不需要频繁的创建销毁,这样大大节省了时间和系统的开销. 线程池,顾名思义,就是一个池子,任务提交的到线程池后,线程池会在池子里边找有没有空闲的线程,如果没有,就会进入等待状态,

线程本地变量ThreadLocal源码解读

  一.ThreadLocal基础知识   原始线程现状: 按照传统经验,如果某个对象是非线程安全的,在多线程环境下,对对象的访问必须采用synchronized进行线程同步.但是Spring中的各种模板类并未采用线程同步机制,因为线程同步会影响并发性和系统性能,而且实现难度也不小. ThreadLocal在Spring中发挥着重要的作用.在管理request作用域的bean,事务管理,任务调度,AOP等模块中都出现了它的身影. ThreadLocal介绍: 它不是一个线程,而是线程的一个本地化

自动化WiFI钓鱼工具——WiFiPhisher源码解读

工具介绍 开源无线安全工具Wifiphisher是基于MIT许可模式的开源软件,运行于Kali Linux之上. github.com/sophron/wifiphisher 它能够对WPA加密的AP无线热点实施自动化钓鱼攻击,获取密码账户.由于利用了社工原理实施中间人攻击,Wifiphisher在实施攻击时无需进行暴力破解. 此外安利一个我们正在开发的项目,基于wifiphisher的校园网钓鱼工具,希望有小伙伴来一起玩耍:-P github.com/noScripts/Campus-Fake

jdk1.8.0_45源码解读——HashMap的实现

jdk1.8.0_45源码解读——HashMap的实现 一.HashMap概述 HashMap是基于哈希表的Map接口实现的,此实现提供所有可选的映射操作.存储的是<key,value>对的映射,允许多个null值和一个null键.但此类不保证映射的顺序,特别是它不保证该顺序恒久不变.  除了HashMap是非同步以及允许使用null外,HashMap 类与 Hashtable大致相同. 此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能.迭代col

HttpClient 4.3连接池参数配置及源码解读

目前所在公司使用HttpClient 4.3.3版本发送Rest请求,调用接口.最近出现了调用查询接口服务慢的生产问题,在排查整个调用链可能存在的问题时(从客户端发起Http请求->ESB->服务端处理请求,查询数据并返回),发现原本的HttpClient连接池中的一些参数配置可能存在问题,如defaultMaxPerRoute.一些timeout时间的设置等,虽不能确定是由于此连接池导致接口查询慢,但确实存在可优化的地方,故花时间做一些研究.本文主要涉及HttpClient连接池.请求的参数

Apache Beam WordCount编程实战及源码解读

概述:Apache Beam WordCount编程实战及源码解读,并通过intellij IDEA和terminal两种方式调试运行WordCount程序,Apache Beam对大数据的批处理和流处理,提供一套先进的统一的编程模型,并可以运行大数据处理引擎上.完整项目Github源码 负责公司大数据处理相关架构,但是具有多样性,极大的增加了开发成本,急需统一编程处理,Apache Beam,一处编程,处处运行,故将折腾成果分享出来. 1.Apache Beam编程实战–前言,Apache B

基于Docker的TensorFlow机器学习框架搭建和实例源码解读

概述:基于Docker的TensorFlow机器学习框架搭建和实例源码解读,TensorFlow作为最火热的机器学习框架之一,Docker是的容器,可以很好的结合起来,为机器学习或者科研人员提供便捷的机器学习开发环境,探索人工智能的奥秘,容器随开随用方便快捷.源码解析TensorFlow容器创建和示例程序运行,为热爱机器学者降低学习难度. 默认机器已经装好了Docker(Docker安装和使用可以看我另一篇博文:Ubuntu16.04安装Docker1.12+开发实例+hello world+w

struct2源码解读(9)之处理Action请求

struct2源码解读之处理Action请求 我们前面讨论过了struct2的初始化,我们先来回顾下  public void init(FilterConfig filterConfig) throws ServletException {         InitOperations init = new InitOperations();         try {             FilterHostConfig config = new FilterHostConfig(fil