gpt4 book ai didi

python - 有没有办法阻止计时器蠕变?

转载 作者:太空宇宙 更新时间:2023-11-03 14:57:47 25 4
gpt4 key购买 nike

我正在寻找一种每秒运行一个方法的方法,无论运行需要多长时间。在寻求帮助时,我遇到了

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

最佳答案

  1. 如果您实际上每次都不需要一个新线程,请不要使用threading.Timer;在循环中定期sleep运行一个函数就可以了(可能在单个单独的线程中)。

  2. 无论您使用什么方法来安排下一次执行,都不要等待您用作间隔的确切时间量 - 其他语句的执行需要时间,因此结果会出现偏差,如您所见。相反,在变量中写下初始时间,并在每次迭代时计算下一次您想要安排执行的时间,并根据现在和当时之间的差异进行 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com