美文网首页
2022-01-04 python 定时器多线程

2022-01-04 python 定时器多线程

作者: netppp | 来源:发表于2022-01-04 16:00 被阅读0次

    https://www.pynote.net/archives/1783

    似乎python中的定时器是都是这样的,设置一个延迟时间,当经过了这么多时间后,某个函数被调用;如果希望反复调用,就需要编程在被调用的函数中,再次实现这个延迟一段时间调用函数的代码。tkinter窗口的after函数就是这样,本文介绍的threading.Timer也是这样的机制。

    import time
    import threading
    
    def createTimer():
        t = threading.Timer(2, repeat)
        t.start()
    
    def repeat():
        print('Now:', time.strftime('%H:%M:%S',time.localtime()))
        createTimer()
    
    createTimer()
    

    这段代码的功能就是每2秒打印出当前的时间,即一个2秒的定时器。运行效果如下:

    E:\py>python timer.py
    Now: 16:36:15
    Now: 16:36:17
    Now: 16:36:19
    Now: 16:36:21
    Now: 16:36:23
    Now: 16:36:25
    Now: 16:36:27
    

    threading.Timer接口还有可以给函数传递任意参数,具体参考python官方页面:https://docs.python.org/3/library/threading.html#timer-objects,还有个cancel函数,可以在定时器被触发前,取消这个Timer。

    threading.Timer创建的是一个线程!这个细节要注意,定时器基本上都是在线程中执行。

    我以前在做C#的应用的时候,就思考过定时器的一个问题:如果定时器内的代码执行时间超过了定时器的间隔,怎么办?看来在python中,这个问题是不存在的,下一次定时器的计时开始,会在定时器代码执行完后才开始。其它编程语言提供的定时器机制,不清楚是否是自动完成了这样的机制,还是不管这个细节,允许定时器函数在程度上并行存在多个执行序列。

    如果想更精确地控制定时器函数的触发时间,就需要把下一次定时器触发的代码,放在定时器执行代码最开始的地方,如下:

    import time
    import threading
    
    def createTimer():
        t = threading.Timer(2, repeat)
        t.start()
    
    def repeat():
        createTimer()
        print('Now-1:', time.strftime('%H:%M:%S',time.localtime()))
        time.sleep(3)
        print('Now-2:', time.strftime('%H:%M:%S',time.localtime()))
    
    createTimer()
    

    定时器repeat要执行至少3秒,但是2秒后,下一个定时器就会被触发,这是允许的!上面这段代码的执行效果如下:

    E:\py>python timer.py
    Now-1: 16:46:12
    Now-1: 16:46:14
    Now-2: 16:46:15
    Now-1: 16:46:16
    Now-2: 16:46:17
    Now-1: 16:46:18
    Now-2: 16:46:19
    Now-1: 16:46:20
    Now-2: 16:46:21
    Now-1: 16:46:22
    Now-2: 16:46:23
    

    从打印信息来分析,同时存在多个repeat函数的执行序列是没问题的,这种情况下,还需要认真考虑定时器函数的可重入问题!

    以上就是对threading.Timer使用的介绍,请注意两种设置定时器循环计时开始的方法,以及他们的区别。


    
    def main():
    
    
        t1 = threading.Timer(1, gupiao)
        t1.start()
        
    
    def gupiao():
        kk=time.strftime("%H:%M:%S", time.localtime())
    #    print(kk)
        if  kk!='15:22:03':
            print(kk)
        else:
            os.popen('a.txt')
        main()
        
    
        
    
    
    if  __name__ == '__main__':
        main()  
    
    
    
    

    相关文章

      网友评论

          本文标题:2022-01-04 python 定时器多线程

          本文链接:https://www.haomeiwen.com/subject/ffnqcrtx.html