按定义的时间间隔运行Python函数

时间:2019-11-03 21:25:53

标签: python scheduled-tasks

我有一个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()每分钟精确执行一次,因此不需要实时操作系统或类似的东西,但是我不希望延迟启动会影响所有随后的。

是否存在某种可以以预定速率运行我的函数的调度程序?还是一些更聪明的方式来补偿偶尔的延迟?

2 个答案:

答案 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