在需要控制线程的启动,程序的运行,具有周期操作的特点,这种时候使用定时器最好不过了
用法:
class threading.Timer(interval, function, args=[], kwargs={})
创建一个timer,在interval秒过去之后,它将以参数args和关键字参数kwargs运行function 。
调用该函数回返回一个定时器的句柄,同时也获得了一个定时器实例。
但是这时,定时器只是被创建,被没有启动,需要调用实例里面的
start()方法启动定时器。如果在定时过程中想要取消该定时器,需要使用cancel()函数。
示例:
def done(): print("hello") if __name__ == '__main__': #1秒后执行done() t1 = threading.Timer(1, done) t1.start()
但是定时器只执行了一次,如何要定时器,能够不停的执行下去呢?
一种方法是利用while(True),不停的创建定时器并启动,显然这种方法显得笨拙,而且会一直占用线程。
例如:
def done(): print("hello") if __name__ == '__main__': #1秒后执行done() while True: t1 = threading.Timer(1, done) t1.start()
另外一种方法,就是在回调函数中,创建定时器并启动,形成递归调用
def done(): print("hello") timer=threading.Timer(1, done) timer.start() if __name__ == '__main__': #1秒后执行done() t1 = threading.Timer(1, done) t1.start()
结果:
程序看起来很简单,通过在回调函数里面,重新创建定时器,来使得定时器能够一直工作。
但是值得注意的是,定时器的句柄需要定义成为一个全局变量,这样做的好处是,创建的定时器进程和实例不会堆积,而是覆盖,避免不必要的内存占用。