改进一个setInterval python的当前实现

我试图找出如何使一个setInterval在python取消,而没有做一个新的类,我想出了如何,但现在我想知道是否有更好的方法来做到这一点。

下面的代码似乎工作正常,但我没有彻底testing它。

import threading def setInterval(func, sec): def inner(): while function.isAlive(): func() time.sleep(sec) function = type("setInterval", (), {}) # not really a function I guess function.isAlive = lambda: function.vars["isAlive"] function.vars = {"isAlive": True} function.cancel = lambda: function.vars.update({"isAlive": False}) thread = threading.Timer(sec, inner) thread.setDaemon(True) thread.start() return function interval = setInterval(lambda: print("Hello, World"), 60) # will print Hello, World every 60 seconds # 3 minutes later interval.cancel() # it will stop printing Hello, World 

有没有办法做到上面没有做一个inheritance自threading.Thread的专用类或使用type("setInterval", (), {}) ? 还是我坚持在做一个专门的课程或继续使用type之间的决定

要在呼叫之间以interval秒钟重复呼叫某个function,并且可以取消将来的呼叫:

 from threading import Event, Thread def call_repeatedly(interval, func, *args): stopped = Event() def loop(): while not stopped.wait(interval): # the first call is in `interval` secs func(*args) Thread(target=loop).start() return stopped.set 

例:

 cancel_future_calls = call_repeatedly(60, print, "Hello, World") # ... cancel_future_calls() 

注意:无论func(*args)花了多长时间,这个版本都会在每次调用后的interval秒左右等待。 如果需要像节拍器一样的滴答声,那么可以用一个timer() stopped.wait(interval)执行: stopped.wait(interval)可以用stopped.wait(interval - timer() % interval)代替,其中timer()定义当前时间它可能是相对的),例如time.time() 。 请参阅在Python中每隔x秒重复执行一次函数的最佳方法是什么?