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源码分析

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

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

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

    本段源码可以学习的地方: 1. 考虑到效率问题,可以通过上下文的机制,在属性被访问的时候临时构建: 2. 可以重写一些魔术方法,比如 __new__ 方法,在调用 object.__new__(cls ...

  2. 一个python线程池的源码解析

    python为了方便人们编程高度封装了很多东西,比如进程里的进程池,大大方便了人们编程的效率,但是默认却没有线程池,本人前段时间整理出一个线程池,并进行了简单的解析和注释,本人水平有限,如有错误希望高 ...

  3. python线程同步原语--源码阅读

    前面两篇文章,写了python线程同步原语的基本应用.下面这篇文章主要是通过阅读源码来了解这几个类的内部原理和是怎么协同一起工作来实现python多线程的. 相关文章链接:python同步原语--线程 ...

  4. Python线程池ThreadPoolExecutor源码分析

    在学习concurrent库时遇到了一些问题,后来搞清楚了,这里记录一下 先看个例子: import time from concurrent.futures import ThreadPoolExe ...

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

    一.什么是线程池 为什么要使用线程池?在多线程并发开发中,线程的数量较多,且每个线程执行一定的时间后就结束了,下一个线程任务到来还需要重新创建线程,这样线程数量特别庞大的时候,频繁的创建线程和销毁线程 ...

  6. 线程本地变量ThreadLocal源码解读

      一.ThreadLocal基础知识 原始线程现状: 按照传统经验,如果某个对象是非线程安全的,在多线程环境下,对对象的访问必须采用synchronized进行线程同步.但是Spring中的各种模板 ...

  7. 如何判断一个Http Message的结束——python源码解读

    HTTP/1.1 默认的连接方式是长连接,不能通过简单的TCP连接关闭判断HttpMessage的结束. 以下是几种判断HttpMessage结束的方式: 1.      HTTP协议约定status ...

  8. selenium之python源码解读-expected_conditions

    一.expected_conditions 之前在 selenium之python源码解读-WebDriverWait 中说到,until方法中method参数,需要传入一个function对象,如果 ...

  9. 线程池:ThreadPoolExecutor源码解读

    目录 1 带着问题去阅读 1.1 线程池的线程复用原理 1.2 线程池如何管理线程 1.3 线程池配置的重要参数 1.4 shutdown()和shutdownNow()区别 1.5 线程池中的两个锁 ...

随机推荐

  1. 一篇文章教会你jQuery应用

    一 认识jQuery jQuery是JavaScript Query的缩写形式.jQuery是一款非常优秀的JavaScript库,即便是MVVM框架盛行的今天,也有超过半数的网页及应用直接或间接的使 ...

  2. SQL SERVER数据库多having 用法

    举实例:查询大于500的数据,并按时间进行汇总排序 select  CONVERT(VARCHAR(10),DGH,23),COUNT(*) from  yxhis2017..VTBMZGHMX201 ...

  3. bugku 很普通的数独

    下载下是一个没有后缀的文件,使用winhex打开,头文件为50 4b 03 为zip文件,修改后缀,打开压缩包,是一大堆数独图片. 仔细看了好久,发现这几张图片像二维码,而且1 5 21这三张图的位置 ...

  4. requests模块(post)请求篇

    '''利用parse模块模拟post请求分析百度词典分析步骤:1. 打开F122. 尝试输入单词girl,发现每敲一个字母后都有请求3. 请求地址是 http://fanyi.baidu.com/su ...

  5. MySQL视图的优缺点以及如何创建视图

    视图,虚拟表,从一个表或多个表中导出来的表,作用和真实表一样,包含一系列带有行和列的数据 视图中,用户可以使用SELECT语句查询数据,也可以使用INSERT,UPDATE,DELETE修改记录,视图 ...

  6. ES6入门之let和const命令

    前言 大家好,我是一只流浪的kk,当你看到这边博客的时候,说明你已经进入了ES6学习的领域了,从本篇博客开始,我将会将自己学习到ES6的相关知识进行整理,方便大家参考和学习,那么我将带你进入第一节的内 ...

  7. powershell(一)

    Windows powershell是一种命令行外壳程序和脚本环境,它内置在win7以上版本的操作系统中,使命令行用户和脚本编写者可以利用.NET Framework的强大功能.powershell程 ...

  8. [Quarks PwDump]Hash dump神器

    好不好用就不用说了哈  记录下使用方式 也支持导出本地哈希.域控哈希等.配合hashcat神器 奇效. 它目前可以导出 : – Local accounts NT/LM hashes +history ...

  9. python如何判断一个对象是否是可迭代的?

    from collections import Iterable test_data = [{"type":1,"keyword":None}, {" ...

  10. 13.Linux文件查找-find命令

    find 命令的基本语法如下: 命令 路径 选项 表达式 动作 find [path...] [options] [expression] [action] 查找 地区 妹纸 18-25岁 约? (1 ...