web-dev-qa-db-ja.com

Python一定の秒数だけ実行するループ

Whileループがあり、15分間実行し続けたい。現在:

while True:
    #blah blah blah

(これが実行されてから再起動します。ループを終了する15分後を除いて、これを続ける必要があります)

ありがとう!

30
oam811

これを試して:

import time

t_end = time.time() + 60 * 15
while time.time() < t_end:
    # do whatever you do

これは、15分x 60秒= 900秒実行されます。

関数 time.timeは、1970年1月1日以降の現在の時間を秒単位で返します。値は浮動小数点であるため、1秒未満の精度でも使用できます。最初は、値t_endは「今」+ 15分と計算されます。ループは、現在の時間がこのプリセット終了時間を超えるまで実行されます。

71
DrV

理解できたら、 datetime.timedelta -

import datetime

endTime = datetime.datetime.now() + datetime.timedelta(minutes=15)
while True:
  if datetime.datetime.now() >= endTime:
    break
  # Blah
  # Blah
4
Elliott Frisch

単にあなたはそれを行うことができます

import time
delay=60*15    ###for 15 minutes delay 
close_time=time.time()+delay
while True:
      ##bla bla
      ###bla bla
     if time.time()>close_time
         break
1
Hasan Latif

ここでこの質問に遭遇したとき、読みやすいタイムループを探していました。何かのようなもの:

for sec in max_seconds(10):
      do_something()

そこで、このヘルパーを作成しました。

# 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

それは私のユースケースでOKだった完全な秒でのみ動作します。

例:

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

間隔は正確ではないことに注意してください。完全な秒数だけ待機するためです(1秒未満の場合、睡眠は決して良くありませんでした)。したがって、ジョブに500ミリ秒かかり、1秒の間隔を要求すると、0、500ミリ秒、2000ミリ秒、2500ミリ秒、4000ミリ秒などで呼び出されます。 sleep()ではなくループで時間を測定することでこれを修正できます...

0
Sascha N.