如何设置定时器和清除定时器?

12

我想创建一个计时器。当时间到达后,会执行一些操作。但是,我可以中断这个计时器并重置它。 伪代码如下:

def timeout():
    print "time out!"
    T.cancel()  # reset timer T
    T = Timer(60, timeout)  
    T.start()

T = Timer(60, timeout)

def interrupt():
    T.cancel()  # reset timer T
    T = Timer(60, timeout)
    T.start()

if __name__ == '__main__':
    T.start()
    while True:
        if something is True:
            # interrupt

我想到的解决方案是在中断函数中取消计时器,然后创建一个新的计时器。但这样做似乎会取消一个计时器并创建一个新的计时器,这不是高性能的做法。有什么好的建议吗?

你能否发布真正的代码而不是伪代码,演示线程如何“消失”? - shx2
抱歉,我犯了一个错误。因为计时器与线程有关,所以我混淆了它们。已经纠正了这个错误。 - city
1个回答

10

threading.Timer() 类很可能是您要找的:


注:该类与Python 2.7文档链接不同,请注意。
from __future__ import print_function
from time import sleep
from random import random
from threading import Timer

def timeout():
    print("Alarm!")

t = Timer(10.0, timeout)
t.start()              # After 10 seconds, "Alarm!" will be printed

sleep(5.0)
if random() < 0.5:     # But half of the time
     t.cancel()        # We might just cancel the timer
     print('Canceling')

2
我的问题是我不知道如何重用计时器。如果每次发生中断,都取消旧的计时器然后创建新的计时器,这样的性能并不高。 - city
1
你觉得取消一个计时器并创建一个新的计时器与暂停和恢复计时器有什么不同吗?纯Python开销和操作系统调用将会非常相似(相对于程序的其余部分来说也同样微不足道)。 - Raymond Hettinger
你如何暂停和恢复计时器?这是他正在问的问题。而且,生成新线程是昂贵的。 - vgoklani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接