Python寒假高级培训第五课——多线程(三)

1、定时器

在需要控制线程的启动,程序的运行,具有周期操作的特点,这种时候使用定时器最好不过了

用法:

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()

结果:Python寒假高级培训第五课——多线程(三)

 

程序看起来很简单,通过在回调函数里面,重新创建定时器,来使得定时器能够一直工作。

但是值得注意的是,定时器的句柄需要定义成为一个全局变量,这样做的好处是,创建的定时器进程和实例不会堆积,而是覆盖,避免不必要的内存占用。

上一篇:Proximal Policy Optimization(PPO)算法实现gym连续动作空间任务Pendulum-v0(pytorch)


下一篇:Python可以玩贪吃蛇等一切小游戏!玩过这游戏的肯定25以上了!