我试图弄清楚如何制作一个在python中取消的setInterval而不需要创建一个完整的新类,我想出了如何但现在我想知道是否有更好的方法来做到这一点。
下面的代码似乎工作正常,但我还没有彻底测试它。
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
有没有办法在不创建继承自threading.Thread
或使用type("setInterval", (), {})
的专用类的情况下执行上述操作?或者我决定在专门课程之间做出决定还是继续使用type
答案 0 :(得分:16)
要在呼叫之间interval
秒重复呼叫一个功能,并且能够取消将来的呼叫:
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()
注意:无论interval
花费多长时间,此版本在每次通话后都会等待func(*args)
秒左右。如果需要类似节拍器的刻度,则可以使用timer()
锁定执行:stopped.wait(interval)
可以替换为stopped.wait(interval - timer() % interval)
,其中timer()
定义当前时间(可能是相对的) )在几秒钟内,例如,time.time()
。见What is the best way to repeatedly execute a function every x seconds in Python?