web-dev-qa-db-fra.com

Boucle Python à exécuter pendant un certain nombre de secondes

J'ai une boucle while et je veux qu'elle continue pendant 15 minutes. c'est actuellement:

while True:
    #blah blah blah

(cela se poursuit, puis redémarre. J'en ai besoin pour continuer sauf à la sortie de la boucle au bout de 15 minutes)

Merci!

23
oam811

Essaye ça:

import time

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

Cela durera 15 min x 60 s = 900 secondes.

La fonction time.time renvoie l'heure actuelle en secondes depuis le 1er janvier 1970. La valeur est en virgule flottante. Vous pouvez donc l'utiliser avec une précision inférieure à la seconde. Au début, la valeur t_end est calculée comme étant "maintenant" + 15 minutes. La boucle fonctionnera jusqu'à ce que l'heure actuelle dépasse l'heure de fin prédéfinie.

61
DrV

Si je vous comprends bien, vous pouvez le faire avec un datetime.timedelta -

import datetime

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

Simplement tu peux le faire

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

Je cherchais une boucle temporelle plus facile à lire lorsque j'ai rencontré cette question ici. Quelque chose comme:

for sec in max_seconds(10):
      do_something()

J'ai donc créé cette aide:

# 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

Cela ne fonctionne qu'avec des secondes complètes, ce qui était acceptable pour mon cas d'utilisation.

Exemples:

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

Sachez que cet intervalle n'est pas si précis, car je n'attends que des secondes entières (dormir n'a jamais été une bonne chose pour moi avec un temps inférieur à 1 seconde) Donc, si votre travail prend 500 ms et que vous demandez un intervalle de 1 seconde, vous serez appelé à: 0, 500ms, 2000ms, 2500ms, 4000ms, etc. On pourrait résoudre ce problème en mesurant le temps en boucle plutôt que de dormir () ...

0
Sascha N.