如果您想要一种非阻塞的方式周期性地执行您的函数,而不是阻塞无限循环,我将使用线程计时器。这样,您的代码就可以继续运行并执行其他任务,并且仍然每n秒钟调用一次函数。我经常使用这种技术来打印长时间、CPU/磁盘/网络密集型任务的进度信息。
下面是我在类似问题中发布的代码,使用start()和top()控件:from threading import Timerclass RepeatedTimer(object):
def __init__(self, interval, function, *args, **kwargs):
self._timer = None
self.interval = interval
self.function = function
self.args = args
self.kwargs = kwargs
self.is_running = False
self.start()
def _run(self):
self.is_running = False
self.start()
self.function(*self.args, **self.kwargs)
def start(self):
if not self.is_running:
self._timer = Timer(self.interval, self._run)
self._timer.start()
self.is_running = True
def stop(self):
self._timer.cancel()
self.is_running = False
用法:from time import sleepdef hello(name):
print "Hello %s!" % nameprint "starting..."rt = RepeatedTimer(1, hello, "World") # it auto-starts, no need of rt.start()try:
sleep(5) # your long-running job goes here...finally:
rt.stop() # better in a try/finally block to make sure the program ends!
特征:标准库,没有外部依赖关系
start()和
stop()即使计时器已经启动/停止,也可以多次调用。
函数可以有位置参数和命名参数。
你可以改变
interval任何时候,它将在下一次运行后生效。同为
args, kwargs甚至
function!