Hvordan kan jeg lage en tidsforsinkelse i Python?

Jeg vil gjerne vite hvordan jeg legger inn en tidsforsinkelse i et Python-skript.

import time
time.sleep(5)   # Delays for 5 seconds. You can also use a float value.

Her er et annet eksempel der noe kjøres omtrent en gang i minuttet:

import time
while True:
    print("This prints once a minute.")
    time.sleep(60) # Delay for 1 minute (60 seconds).
Kommentarer (8)

Du kan bruke funksjonen sleep() i modulen time. Den kan ta et float-argument for oppløsning under sekundet.

from time import sleep
sleep(0.1) # Time in seconds
Kommentarer (0)

Litt moro med en søvnig generator.

Spørsmålet handler om tidsforsinkelse. Det kan være fast tid, men i noen tilfeller kan vi trenge en forsinkelse målt siden forrige gang. Her er en mulig løsning:

Forsinkelse målt siden forrige gang (våkner regelmessig)

Situasjonen kan være at vi ønsker å gjøre noe så regelmessig som mulig, og vi ønsker ikke å bry oss med alle last_time, next_time ting rundt koden vår.

Buzzer generator

Følgende kode (sleepy.py) definerer en buzzergen generator:

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

Påkaller vanlig 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()

Og kjører den ser vi:

1400102636.46
1400102639.46
1400102642.46
1400102647.47
1400102650.47

Vi kan også bruke den direkte i en løkke:

import random
for ring in buzzergen(3):
    print "now", time.time()
    print "ring", ring
    time.sleep(random.choice([0, 2, 4, 6]))

Og når vi kjører den, kan vi se:

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)

Som vi ser, er denne summeren ikke for stiv og lar oss ta igjen vanlige søvnige intervaller selv om vi sover og kommer ut av vanlig tidsplan.

Kommentarer (0)