我正在寻找一种每秒运行一个方法的方法,而不管它要花多长时间。在寻求帮助时,我遇到了

Run certain code every n seconds

并在尝试中发现它无法正常工作。似乎有一个我要避免的问题:漂移。我尝试在打印后添加“ sleep(0.5)”,但实际上确实减慢了循环速度,并且间隔保持在1.003(大约)秒。

有没有办法解决这个问题,做我想做的事?

(venv) 20170728-153445 mpeck@bilbo:~/dev/whiskerlabs/aphid/loadtest$ cat a.py
import threading
import time
def woof():
  threading.Timer(1.0, woof).start()
  print "Hello at %s" % time.time()
woof()
(venv) 20170728-153449 mpeck@bilbo:~/dev/whiskerlabs/aphid/loadtest$ python a.py
Hello at 1501281291.84
Hello at 1501281292.85
Hello at 1501281293.85
Hello at 1501281294.85
Hello at 1501281295.86
Hello at 1501281296.86
Hello at 1501281297.86
Hello at 1501281298.87
Hello at 1501281299.87
Hello at 1501281300.88
Hello at 1501281301.88
Hello at 1501281302.89
Hello at 1501281303.89
Hello at 1501281304.89
Hello at 1501281305.89
Hello at 1501281306.9
Hello at 1501281307.9
Hello at 1501281308.9
Hello at 1501281309.91
Hello at 1501281310.91
Hello at 1501281311.91
Hello at 1501281312.91
Hello at 1501281313.92
Hello at 1501281314.92
Hello at 1501281315.92
Hello at 1501281316.93

最佳答案

如果实际上每次都不需要新线程,请不要使用threading.Timer;在循环中定期运行功能sleep可以(可能在单个单独的线程中)。
无论您使用哪种方法安排下一次执行的时间,都不要等待用作间隔的确切时间-其他语句的执行需要时间,因此您看到的结果是漂移。取而代之的是,在变量中写下初始时间,并在每次迭代中计算下一次要安排执行和睡眠的时间,以计算现在和之后的时间差。

interval = 1.
next_t = time.time()
while True:
    next_t += interval
    time.sleep(next_t - time.time())
    # do whatever you want to do


(当然,您可以对其进行优化以提高整体精度,但这至少应避免漂移)

关于python - 有没有办法阻止计时器爬行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45384065/

10-11 21:56