python threading timer没执行_python线程threading.Timer源码解读

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,如果是空就给一个空字典

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 classTimer(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 waiting7

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,如果是空就给一个空list15 self.kwargs = kwargs if kwargs is not None else{} # 同理,kwargs不是空的就是kwargs,如果是空就给一个空字典16 self.finished =Event() # 再添加一个属性finished,是一个Event类的实例,这里知道Event类的实例用法就知道它在这里要怎么用了17

18 defcancel(self):

"""如果finished属性还没有被set,即函数function还没有被调用的之前阻止,因为下面函数调用之前会判断finished是否被set了,所以这里赶在调用之前注定set就能够阻止后面的调用。"""19 """Stop the timer if it hasn't finished yet."""

20 self.finished.set()21

22 defrun(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 notself.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多次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值