我想要的是能够每秒运行一个函数,与函数花费的时间无关(它应该总是在一秒钟之内).我考虑了很多选择,但不确定哪个是最好的.
如果我只使用延迟功能,则不会考虑该功能运行所需的时间.
如果我对函数进行计时,然后从一秒中减去该函数并在延迟中弥补其余部分,则不会考虑时间计算.
我尝试使用threading.timer(我不确定这是如何工作的来龙去脉)但它看起来确实比1s慢.
这是我尝试测试threading.timer的代码:
def update(i):
sys.stdout.write(str(i)+'\r')
sys.stdout.flush()
print i
i += 1
threading.Timer(1, update, [i]).start()
Run Code Online (Sandbox Code Playgroud)
有没有办法与函数所用的时间长度无关?
实际上不应该使用使用threading.Timer(参见下面的代码)的方法,因为每个时间间隔都会启动一个新线程,并且这个循环永远不能干净地停止.
# as seen here: https://stackoverflow.com/a/3393759/1025391
def update(i):
threading.Timer(1, update, [i+1]).start()
# business logic here
Run Code Online (Sandbox Code Playgroud)
如果你想要一个后台循环,最好启动一个运行循环的新线程,如另一个答案所述.哪个能够收到一个停止信号,你join()最终可以线程.
这个相关的答案似乎是实现这一点的一个很好的起点.
如果f()总是花费不到一秒那么在一秒边界上运行它(没有漂移):
import time\n\nwhile True:\n time.sleep(1 - time.monotonic() % 1) \n f()\nRun Code Online (Sandbox Code Playgroud)\n这个想法来自@Dave Rove 对类似问题的回答。
\n要了解其工作原理,请考虑一个示例:
\ntime.monotonic()返回13.7和time.sleep(0.3)调用f()在 (\xc2\xb1some error) 秒左右被调用14(因为time.monotonic()纪元起)f()运行并且需要0.1(< 1) 秒time.monotonic()返回大约14.1几秒并且time.sleep(0.9)称为15一次(因为time.monotonic()纪元以来)f()运行并且需要0.3(< 1) 秒(注意:该值与步骤 2 不同。)time.monotonic()返回大约15.3和time.sleep(0.7)称为f()被称为周围16并重复循环。每一步都f()在一秒边界上调用(根据time.monotonic()计时器)。错误不会累积。没有漂移。
另请参阅:如何在 python 中定期运行函数(使用 tkinter)。
\n这样就可以了,其准确性不会随着时间而漂移。
import time
start_time = time.time()
interval = 1
for i in range(20):
time.sleep(start_time + i*interval - time.time())
f()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19330 次 |
| 最近记录: |