Θα ήθελα να μάθω πώς να βάλω μια χρονική καθυστέρηση σε ένα σενάριο Python.
import time
time.sleep(5) # Delays for 5 seconds. You can also use a float value.
Εδώ είναι ένα άλλο παράδειγμα όπου κάτι εκτελείται περίπου μία φορά το λεπτό:
import time
while True:
print("This prints once a minute.")
time.sleep(60) # Delay for 1 minute (60 seconds).
Μπορείτε να χρησιμοποιήσετε τη συνάρτηση sleep()
στην ενότητα time
. Μπορεί να λάβει ένα όρισμα float για ανάλυση σε υποδευτερόλεπτα.
from time import sleep
sleep(0.1) # Time in seconds
Λίγη διασκέδαση με μια νυσταγμένη γεννήτρια.
Η ερώτηση αφορά τη χρονική καθυστέρηση. Μπορεί να είναι σταθερός χρόνος, αλλά σε ορισμένες περιπτώσεις μπορεί να χρειαζόμαστε μια καθυστέρηση που μετράται από την τελευταία φορά. Εδώ είναι μια πιθανή λύση:
Η κατάσταση μπορεί να είναι, θέλουμε να κάνουμε κάτι όσο το δυνατόν πιο τακτικά και δεν θέλουμε να ασχοληθούμε με όλα τα πράγματα last_time
, next_time
σε όλο τον κώδικα μας.
Ο παρακάτω κώδικας (sleepy.py) ορίζει μια γεννήτρια buzzergen
:
import time
from itertools import count
def buzzergen(period):
nexttime = time.time() + period
for i in count():
now = time.time()
tosleep = nexttime - now
if tosleep > 0:
time.sleep(tosleep)
nexttime += period
else:
nexttime = now + period
yield i, nexttime
from sleepy import buzzergen
import time
buzzer = buzzergen(3) # Planning to wake up each 3 seconds
print time.time()
buzzer.next()
print time.time()
time.sleep(2)
buzzer.next()
print time.time()
time.sleep(5) # Sleeping a bit longer than usually
buzzer.next()
print time.time()
buzzer.next()
print time.time()
Και εκτελώντας το βλέπουμε:
1400102636.46
1400102639.46
1400102642.46
1400102647.47
1400102650.47
Μπορούμε επίσης να το χρησιμοποιήσουμε απευθείας σε έναν βρόχο:
import random
for ring in buzzergen(3):
print "now", time.time()
print "ring", ring
time.sleep(random.choice([0, 2, 4, 6]))
Και εκτελώντας το μπορεί να δούμε:
now 1400102751.46
ring (0, 1400102754.461676)
now 1400102754.46
ring (1, 1400102757.461676)
now 1400102757.46
ring (2, 1400102760.461676)
now 1400102760.46
ring (3, 1400102763.461676)
now 1400102766.47
ring (4, 1400102769.47115)
now 1400102769.47
ring (5, 1400102772.47115)
now 1400102772.47
ring (6, 1400102775.47115)
now 1400102775.47
ring (7, 1400102778.47115)
Όπως βλέπουμε, αυτός ο βομβητής δεν είναι πολύ άκαμπτος και μας επιτρέπει να προλάβουμε τα τακτικά διαστήματα ύπνου, ακόμη και αν παρακοιμηθούμε και βγούμε από το κανονικό πρόγραμμα.