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!
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.
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
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
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 () ...