it-swarm.com.de

Python-Schleife für eine bestimmte Anzahl von Sekunden

Ich habe eine while-Schleife und möchte, dass sie 15 Minuten durchgeht. es ist momentan:

while True:
    #blah blah blah

(Dies läuft durch und startet neu. Ich brauche es, um fortzufahren, außer nach 15 Minuten verlässt es die Schleife)

Vielen Dank!

23
oam811

Versuche dies:

import time

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

Dies dauert 15 Minuten x 60 Sekunden = 900 Sekunden.

Die Funktion time.time gibt die aktuelle Zeit in Sekunden seit dem 1. Januar 1970 zurück. Der Wert befindet sich in Fließkommazahl, sodass Sie ihn sogar mit einer Genauigkeit von weniger als einer Sekunde verwenden können. Zu Beginn wird der Wert t_end mit "jetzt" + 15 Minuten berechnet. Die Schleife läuft, bis die aktuelle Uhrzeit diese voreingestellte Endzeit überschreitet.

61
DrV

Wenn ich Sie verstehe, können Sie es mit einem datetime.timedelta - tun

import datetime

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

Sie können es einfach tun

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
0
Hasan Latif

Ich war auf der Suche nach einer leichter zu lesenden Zeitschleife, als ich hier auf diese Frage gestoßen bin. So etwas wie:

for sec in max_seconds(10):
      do_something()

Also habe ich diesen Helfer geschaffen:

# 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

Es funktioniert nur mit vollen Sekunden, was für meinen Anwendungsfall in Ordnung war.

Beispiele:

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

Beachten Sie, dass das Intervall nicht so genau ist, da ich nur volle Sekunden warte (der Schlaf hat mir mit Zeiten <1 Sek. Nie gut getan). Wenn Ihr Job also 500 ms dauert und Sie nach einem Intervall von 1 s fragen, werden Sie bei 0, 500 ms, 2000 ms, 2500 ms, 4000 ms usw. angerufen. Man könnte dies beheben, indem man die Zeit in einer Schleife misst und nicht sleep () ...

0
Sascha N.