【发布时间】:2019-11-03 21:25:53
【问题描述】:
我有一个 Python 循环,应该每分钟运行一次,进行一些数据处理并休眠到下一分钟。然而,处理需要的时间是可变的,有时在没有太多事情可做时接近于零,有时甚至需要 10 或 20 秒。
为了弥补这一点,我测量运行处理所需的时间,如下所示:
while True:
time_start = time.time()
do_something() # <-- This takes unknown time
time_spent = time.time() - time_start
time.sleep(60 - time_spent)
它有点工作,但几天后它仍然会漂移几秒钟。我猜它发生在计算机(小树莓派)很忙并延迟循环的开始时,然后一切都开始溜走。
我不需要do_something() 每分钟执行准确,所以不需要实时操作系统或类似的东西,但我不希望一个延迟启动影响所有后续启动要么。
是否有某种调度程序可以以预定义的速率运行我的函数?或者一些更聪明的方法来弥补偶尔的延迟?
【问题讨论】:
-
如果你真的想要这种并发,我认为你必须使用线程。一个线程作为计时器,另一个作为工作线程。
-
@phalanx 如果计时器线程被延迟/溜走怎么办?我认为这与我使用的时间戳补偿方法没有什么不同。除非你的意思是一些(硬件)计划的计时器?
-
time.sleep(60 - time.time() % 60)作为最后一行怎么样? -
@quamrana 谢谢,但对于我所追求的简单固定速率触发器来说,这是一个过于复杂的解决方案。我下面的解决方案似乎适用于我的情况。