zoukankan      html  css  js  c++  java
  • 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多次。
  • 相关阅读:
    AVL自平衡二叉树
    笔试+面试信息整理----面向笔试学习、面向面经编程
    传入值参数&传入引用参数的区别
    NLPIR智能挖掘实现行业大数据应用价值
    NLPIR大数据挖掘融合库、智、理三大先进理论技术
    NLPIR智能语义挖掘文本大数据深层意义
    NLPIR智能语义技术从采集到分析一步到位
    灵玖软件:NLPIR智能挖掘对文本数据精细化分析
    九眼合同智能审核系统运用NLPIR大数据技术进行核查
    NLPIR九眼智能审核平台助合同文本深度核查
  • 原文地址:https://www.cnblogs.com/duanming/p/11830728.html
Copyright © 2011-2022 走看看