我有一个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)
这是可行的,但是经过几天,它仍然漂移了几秒钟。我猜想这会在计算机(小型Raspberry Pi)忙碌并延迟循环开始时发生,然后一切开始溜走。
我不需要do_something()
每分钟精确执行一次,因此不需要实时操作系统或类似的东西,但是我不希望延迟启动会影响所有随后的。
是否存在某种可以以预定速率运行我的函数的调度程序?还是一些更聪明的方式来补偿偶尔的延迟?
答案 0 :(得分:1)
稍微玩一下循环似乎效果很好。诀窍是在循环开始之前记录一次开始时间,而不是在每次迭代中记录一次。这样一来,延迟的启动就不会影响任何以后的启动。
rate_sec = 60
time_start = time.time()
while True:
print("{}".format(datetime.now()))
# Emulate processing time 0s to 20s
time.sleep(random.randint(0, 20))
# Sleep until the next 'rate_sec' multiple
delay = rate_sec - (time.time() - time_start) % rate_sec
time.sleep(delay)
答案 1 :(得分:0)
睡觉是您项目的先决条件吗?我的意思是,如果您想每隔1分钟运行一次任务,则无需阻塞处理。
由于您使用的是Raspberry Pi,因此可以(并且应该使用)crontab。
这将为您提供最大的灵活性,并让您不让计算机处于空闲状态。
为此,请打开您的cron标签
crontab -e
并添加以下条目
* * * * * /usr/bin/env python3 /path/to/script.py