每秒运行一个python函数

DNN*_*DNN 3 python

我想要的是能够每秒运行一个函数,与函数花费的时间无关(它应该总是在一秒钟之内).我考虑了很多选择,但不确定哪个是最好的.

如果我只使用延迟功能,则不会考虑该功能运行所需的时间.

如果我对函数进行计时,然后从一秒中减去该函数并在延迟中弥补其余部分,则不会考虑时间计算.

我尝试使用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)

有没有办法与函数所用的时间长度无关?

moo*_*eep 6

实际上不应该使用使用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()最终可以线程.

这个相关的答案似乎是实现这一点的一个很好的起点.


jfs*_*jfs 6

如果f()总是花费不到一秒那么在一秒边界上运行它(没有漂移):

\n
import time\n\nwhile True:\n    time.sleep(1 - time.monotonic() % 1)      \n    f()\n
Run Code Online (Sandbox Code Playgroud)\n

这个想法来自@Dave Rove 对类似问题的回答

\n

要了解其工作原理,请考虑一个示例:

\n
    \n
  1. time.monotonic()返回13.7time.sleep(0.3)调用
  2. \n
  3. f()在 (\xc2\xb1some error) 秒左右被调用14(因为time.monotonic()纪元起)
  4. \n
  5. f()运行并且需要0.1(< 1) 秒
  6. \n
  7. time.monotonic()返回大约14.1几秒并且time.sleep(0.9)称为
  8. \n
  9. 步骤 2. 大约几秒钟重复15一次(因为time.monotonic()纪元以来)
  10. \n
  11. f()运行并且需要0.3(< 1) 秒(注意:该值与步骤 2 不同。)
  12. \n
  13. time.monotonic()返回大约15.3time.sleep(0.7)称为
  14. \n
  15. f()被称为周围16并重复循环。
  16. \n
\n

每一步都f()在一秒边界上调用(根据time.monotonic()计时器)。错误不会累积。没有漂移。

\n

另请参阅:如何在 python 中定期运行函数(使用 tkinter)

\n


Rod*_*iro 5

这样就可以了,其准确性不会随着时间而漂移。

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)