Python多线程Timer定时器与Event事件详解
本文深入解析Python多线程中的Timer定时器与Event事件。Timer继承自Thread,用于指定时间后执行函数并支持取消操作;Event通过内部flag标记实现线程间简单通信,配合wait方法可实现超时等待与同步控制。文章包含源码分析、实例代码及运行结果,帮助开发者掌握并发编程中的定时与同步技巧。
Python Timer定时器基础与源码解析
Timer类直接继承自Thread类,因此它本质上是一个线程类,具备标准线程的所有能力与特征。该类的核心用途是定义一个定时器,用于在指定的时间间隔后执行目标函数。
Timer的实例是一个能够延迟执行特定函数的线程对象。在目标函数真正被执行之前,用户可以通过调用cancel方法来提前取消该定时器的执行。
以下是Timer类的核心源码实现:
class Timer(Thread):
def __init__(self, interval, function, args=None, kwargs=None):
Thread.__init__(self)
self.interval = interval
self.function = function
self.args = args if args is not None else []
self.kwargs = kwargs if kwargs is not None else {}
self.finished = Event()
def cancel(self):
"""Stop the timer if it hasn't finished yet."""
self.finished.set()
def run(self):
self.finished.wait(self.interval)
if not self.finished.is_set():
self.function(*self.args, **self.kwargs)
self.finished.set()
Timer类的使用方式与Thread定义子线程类似。在初始化时,需要传入interval参数指定间隔时间,function参数指定要执行的函数,同时可以通过args和kwargs参数传递函数所需的参数。
以下代码演示了如何在执行前提前取消Timer:
import threading
import time
def add(x,y):
print(x+y)
t = threading.Timer(10,add,args=(4,5))
t.start()
time.sleep(2)
t.cancel()
print("===end===")
运行结果如下:
===end===
当调用start方法后,Timer对象进入等待状态,等待指定的10秒时间。时间到达后,程序会执行add函数。然而,在等待阶段,主线程调用了子线程的cancel方法,导致定时器被取消,从而跳过执行函数直接结束。
基于Event事件实现Timer计时器
此外,还可以使用Event事件来实现类似的Timer计时器功能:
import threading
import logging
import time
logging.basicConfig(level=logging.INFO)
# class MyTimer(threading.Thread):
class MyTimer:
def __init__(self,interval,fn,args=None):
self.interval = interval
self.fn = fn
self.args = args
self.event = threading.Event()
def start(self):
threading.Thread(target=self.__do).start()
def cancel(self):
self.event.set()
def __do(self):
self.event.wait(self.interval)
if not self.event.is_set():
self.fn(*self.args)
def add(x,y):
logging.warning(x+y)
t = MyTimer(5,add,(4,5))
t.start()
# time.sleep(2)
# t.cancel()
运行结果如下:
WARNING:root:9
Event事件机制与线程同步
Event事件是线程间通信机制中最简单的实现方式。它使用一个内部的标记flag,通过改变flag的True或False状态来协调线程操作。
Event类的源码实现如下:
class Event:
def __init__(self):
self._cond = Condition(Lock())
self._flag = False
def _reset_internal_locks(self):
self._cond.__init__(Lock())
def is_set(self):
return self._flag
isSet = is_set
def set(self):
with self._cond:
self._flag = True
self._cond.notify_all()
def clear(self):
with self._cond:
self._flag = False
def wait(self, timeout=None):
with self._cond:
signaled = self._flag
if not signaled:
signaled = self._cond.wait(timeout)
return signaled
Event类提供了以下关键方法:
• set():将flag设置为True • clear():将flag设置为False • is_set():检查flag是否为True,返回布尔值 • wait(timeout=None):设置等待flag变为True的最大时长,若为None则无限等待。若等到flag变真则返回True,若超时未等到则返回False。
以下是一个具体的应用示例:
场景描述:老板雇佣了一名工人生产杯子,老板一直等待,直到工人生产出10个杯子为止。
import threading
import logging
import time
logging.basicConfig(level=logging.INFO)
cups = []
event = threading.Event()#event对象
def boss(e:threading.Event):
if e.wait(30):#最多等待30秒
logging.info('Good job.')
def worker(n,e:threading.Event):
while True:
time.sleep(0.5)
cups.append(1)
logging.info('make 1')
if len(cups) >=n:
logging.info('I finished my job. {}'.format(len(cups)))
e.set()#flag设置为True
break
b = threading.Thread(target=boss,name='boos',args=(event,))
w = threading.Thread(target=worker,args=(10,event))
w.start()
b.start()
运行结果如下:
INFO:root:make 1 INFO:root:make 1 INFO:root:make 1 INFO:root:make 1 INFO:root:make 1 INFO:root:make 1 INFO:root:make 1 INFO:root:make 1 INFO:root:make 1 INFO:root:make 1 INFO:root:I finished my job. 10 INFO:root:Good job.
在这个示例中,老板和工人共享同一个Event对象的标记flag。
老板调用wait()方法,设置最大等待时间为30秒,等待flag变为True。工人在生产够10个杯子时,将flag设置为True。如果工人在30秒内未能完成生产,老板将超时退出。
以下是wait方法的具体使用代码:
import threading
import logging
logging.basicConfig(level=logging.INFO)
def do(event:threading.Event,interval:int):
while not event.wait(interval): # not event.wait(1) = True
logging.info('To do sth.')
e = threading.Event()
t = threading.Thread(target=do,args=(e,1))
t.start()
e.wait(10) # 也可以使用time.sleep(10)
e.set()
print('Man Exit.')
运行结果如下:
INFO:root:To do sth. INFO:root:To do sth. INFO:root:To do sth. INFO:root:To do sth. INFO:root:To do sth. INFO:root:To do sth. INFO:root:To do sth. INFO:root:To do sth. INFO:root:To do sth. Man Exit.
wait与sleep的主要区别在于:wait会主动让出时间片,允许其他线程被调度执行;而sleep会占用时间片且不主动让出,直到睡眠时间结束。
本节对Timer和Event进行总结:
Timer定时器继承自Thread类,属于线程类。其作用是在等待n秒钟之后执行某个目标函数,并且可以通过调用cancel方法提前取消执行。
Event事件通过维护一个True或False的flag标记值来协调操作。wait()方法可以设置等待flag变为True的最长时间,如果超时后flag仍未设置为True,则返回False。
Python Timer类补充说明
PS:下面看下python之定时器Timer
timer类
Timer(定时器)是Thread的派生类,专门用于在指定的时间后调用一个方法。
其构造方法如下:
Timer(interval, function, args=[], kwargs={})
interval: 指定的时间
function: 要执行的方法
args/kwargs: 方法的参数
实例方法列表:
Timer从Thread派生,并未增加新的实例方法,主要依赖父类的方法。
示例代码一:
# encoding: UTF-8
import threading
def func():
print 'hello timer!'
timer = threading.Timer(5, func)
timer.start()
线程延迟5秒后执行指定函数。
总结
以上所述是小编给大家介绍的详解Python 多线程 Timer定时器/延迟执行、Event事件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









