Πώς μπορώ να δημιουργήσω μια χρονική καθυστέρηση στην Python;

Θα ήθελα να μάθω πώς να βάλω μια χρονική καθυστέρηση σε ένα σενάριο 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).
Σχόλια (8)

Μπορείτε να χρησιμοποιήσετε τη συνάρτηση sleep() στην ενότητα time. Μπορεί να λάβει ένα όρισμα float για ανάλυση σε υποδευτερόλεπτα.

from time import sleep
sleep(0.1) # Time in seconds
Σχόλια (0)

Λίγη διασκέδαση με μια νυσταγμένη γεννήτρια.

Η ερώτηση αφορά τη χρονική καθυστέρηση. Μπορεί να είναι σταθερός χρόνος, αλλά σε ορισμένες περιπτώσεις μπορεί να χρειαζόμαστε μια καθυστέρηση που μετράται από την τελευταία φορά. Εδώ είναι μια πιθανή λύση:

Καθυστέρηση που μετράται από την τελευταία φορά (τακτική αφύπνιση)

Η κατάσταση μπορεί να είναι, θέλουμε να κάνουμε κάτι όσο το δυνατόν πιο τακτικά και δεν θέλουμε να ασχοληθούμε με όλα τα πράγματα 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

Κλήση του κανονικού buzzergen

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)

Όπως βλέπουμε, αυτός ο βομβητής δεν είναι πολύ άκαμπτος και μας επιτρέπει να προλάβουμε τα τακτικά διαστήματα ύπνου, ακόμη και αν παρακοιμηθούμε και βγούμε από το κανονικό πρόγραμμα.

Σχόλια (0)