【问题标题】:Sleeping for the remaining time剩下的时间睡觉
【发布时间】:2019-05-05 17:16:23
【问题描述】:

我试图每分钟运行一个方法。

该方法在 Internet 上执行一些操作,因此可能需要 1 秒到 30 秒。

我要做的是计算此方法花费的时间,然后休眠剩余时间,以确保该方法本身每分钟运行一次。

目前我的代码如下所示:

def do_operation():
    access_db()
    sleep(60)

正如您所看到的,这并没有考虑到任何延迟,虽然它有效,但它在某些时候会失败并完全跳过一分钟,这永远不会发生。

【问题讨论】:

标签: python time


【解决方案1】:
import time

def do_operation():
    start = time.time()
    access_db()
    time.sleep(60-time.time()+start)

【讨论】:

    【解决方案2】:

    此代码将允许您在定义的时间间隔内运行可调用对象:

    import time
    import random
    
    def recurring(interval, callable):
        i = 0
        start = time.time()
        while True:
            i += 1
            callable()
            remaining_delay = max(start + (i * interval) - time.time(), 0)
            time.sleep(remaining_delay)
    
    def tick_delay():
        print('tick start')
        time.sleep(random.randrange(1, 4))
        print('tick end')
    
    recurring(5, tick_delay)
    

    注意事项

    • 函数tick_delay 休眠几秒钟以模拟可能需要未定义时间的函数。
    • 如果可调用的时间比定义的循环间隔长,下一次迭代将在最后一次结束后立即安排。要让 callable 并行运行,您需要使用 threadingasyncio

    【讨论】:

      猜你喜欢
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      相关资源
      最近更新 更多