python-3.x - 改进 setInterval python的当前实现

  显示原文与译文双语对照的内容

我想弄清楚如何在 python 中取消一个全新的类,但是我想知道如何有更好的方法。

下面的代码看起来很好,但是我还没有彻底地测试过它,。


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

时间: 原作者:

要在调用和取消以后调用的能力之间重复使用 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() 。 查看在 python 中重复执行函数的最佳方法是什么

原作者:
...