Python loop to run for certain amount of seconds

后端 未结 6 1386
萌比男神i
萌比男神i 2020-12-02 22:08

I have a while loop, and I want it to keep running through for 15 minutes. it is currently:

while True:
    #blah blah blah

(this runs thro

6条回答
  •  有刺的猬
    2020-12-02 22:55

    I was looking for an easier-to-read time-loop when I encountered this question here. Something like:

    for sec in max_seconds(10):
          do_something()
    

    So I created this helper:

    # allow easy time-boxing: 'for sec in max_seconds(42): do_something()'
    def max_seconds(max_seconds, *, interval=1):
        interval = int(interval)
        start_time = time.time()
        end_time = start_time + max_seconds
        yield 0
        while time.time() < end_time:
            if interval > 0:
                next_time = start_time
                while next_time < time.time():
                    next_time += interval
                time.sleep(int(round(next_time - time.time())))
            yield int(round(time.time() - start_time))
            if int(round(time.time() + interval)) > int(round(end_time)): 
                return
    

    It only works with full seconds which was OK for my use-case.

    Examples:

    for sec in max_seconds(10) # -> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    for sec in max_seconds(10, interval=3) # -> 0, 3, 6, 9
    for sec in max_seconds(7): sleep(1.5) # -> 0, 2, 4, 6
    for sec in max_seconds(8): sleep(1.5) # -> 0, 2, 4, 6, 8
    

    Be aware that interval isn't that accurate, as I only wait full seconds (sleep never was any good for me with times < 1 sec). So if your job takes 500 ms and you ask for an interval of 1 sec, you'll get called at: 0, 500ms, 2000ms, 2500ms, 4000ms and so on. One could fix this by measuring time in a loop rather than sleep() ...

提交回复
热议问题