Lær Python time.sleep(): Legg til forsinkelser i koden din!

Innføring i `time.sleep()` i Python

Denne guiden tar for seg hvordan du kan bruke `sleep()`-funksjonen fra Pythons innebygde `time`-modul for å introdusere pauser i programutførelsen.

Normalt vil et Python-program kjøre linje for linje uten forsinkelser. Men i visse situasjoner kan det være nødvendig å pause utførelsen i en spesifikk tidsperiode. Dette er der `sleep()`-funksjonen kommer inn i bildet, ved å tilby en enkel måte å kontrollere tidspunktene for utførelse.

I denne opplæringen skal vi se nærmere på hvordan `sleep()`-funksjonen fungerer, ved å gå gjennom syntaksen og en rekke praktiske eksempler for å illustrere bruken. La oss sette i gang!

Syntaks for `time.sleep()`

`time`-modulen, som er en del av Pythons standardbibliotek, har mange nyttige funksjoner relatert til tid. For å begynne å bruke `sleep()`, må du først importere `time`-modulen:

import time

Etter at modulen er importert, kan du kalle `sleep()`-funksjonen ved hjelp av denne syntaksen:

time.sleep(n)

Her representerer `n` antall sekunder programmet skal «sove». Verdien kan være både et heltall og et desimaltall.

I noen tilfeller kan det være nødvendig med svært korte forsinkelser, for eksempel i millisekunder. Da må du konvertere millisekunder til sekunder før du kaller `sleep()`. For eksempel, for å pause i 100 millisekunder, må du bruke `time.sleep(0.1)`.

Du kan også importere bare `sleep()`-funksjonen direkte:

from time import sleep

Ved å bruke denne metoden, kan du kalle `sleep()` uten å måtte skrive `time.sleep()`, bare `sleep()`.

Nå som du har fått en forståelse for hvordan `sleep()`-funksjonen fungerer, la oss se på noen praktiske eksempler. Alle kodeeksemplene i denne opplæringen er tilgjengelige i python-sleep-mappen i dette GitHub-repoet.

Grunnleggende bruk av `sleep()`

La oss begynne med et enkelt eksempel som illustrerer hvordan `sleep()` kan brukes for å forsinke programutførelsen.

Koden under viser hvordan:

  • Den første `print()`-setningen kjøres umiddelbart.
  • Deretter bruker vi `time.sleep(5)` for å introdusere en 5-sekunders pause.
  • Den andre `print()`-setningen kjøres først etter at pausen er over.
    import time

    print("Skriv ut nå")
    time.sleep(5)
    print("Skriv ut etter 5 sekunders pause")
    

For å se dette i praksis, lagre koden som en fil `simple_example.py` og kjør den fra kommandolinjen:

$ python3 simple_example.py

Variabel forsinkelse i en løkke

I det forrige eksemplet så vi hvordan man kunne introdusere en fast forsinkelse. La oss nå se på hvordan man kan bruke `sleep()` for å introdusere varierende forsinkelser mens man itererer gjennom en samling.

Vi skal gjøre følgende:

  • Gå gjennom en setning, ord for ord.
  • Skrive ut hvert ord.
  • Legge inn en variabel forsinkelse mellom hvert ord.

Iterere gjennom en streng

Tenk deg strengen: «Dette er en test». Dette er en streng der hvert ord er en streng i seg selv.

Hvis vi bare går gjennom denne strengen, får vi ut hvert enkelt tegn, slik:

    >>> setning = "Dette er en test"
    >>> for tegn in setning:
    ...     print(tegn)

    # Output (forkortet)
    D
    e
    t
    t
    e
    ...
    

Dette er ikke hva vi ønsker. Vi ønsker å iterere gjennom hvert ord i setningen. For å gjøre dette, kan vi bruke `split()`-metoden på setningen. Dette vil returnere en liste med ord.

    >>> setning.split()
    ['Dette', 'er', 'en', 'test']
    >>> for ord in setning.split():
    ...     print(ord)

    # Output
    Dette
    er
    en
    test
    

Iterasjon med varierende forsinkelser

La oss se på dette eksemplet igjen:

  • `setning` er strengen vi ønsker å gå gjennom.
  • `forsinkelse_tider` er listen med forsinkelser vi ønsker å bruke i `sleep()` funksjonen.

Her skal vi iterere gjennom to lister samtidig. Vi kan bruke `zip()`-funksjonen for å utføre denne parallelle iterasjonen. `zip(liste1, liste2)` vil returnere en iterator med tupler, hvor hver tuppel inneholder elementer fra hver liste.

  import time

  sleep_times = [3,4,1.5,2,0.75]
  sentence = "Dette er en lang setning"
  for sleep_time, word in zip(sleep_times, sentence.split()):
      print(word)
      time.sleep(sleep_time)
  

Uten `sleep()` ville programmet gått direkte til neste iterasjon. Med `sleep()`-funksjonen vil programmet pause før det går videre.

Lagre koden som `delay_times.py`, og kjør den:

$ python3 delay_times.py

Hvert ord vil bli skrevet ut med den angitte forsinkelsen. For eksempel vil det første ordet skrives ut, deretter vil programmet vente 3 sekunder før neste ord skrives ut og så videre.

Nedtellingstidtaker

La oss lage en enkel nedtellingstidtaker med Python:

Vi definerer funksjonen `countDown()`:

  import time

  def countDown(n):
      for i in range(n, -1, -1):
          if i == 0:
              print("Klar!")
          else:
              print(i)
              time.sleep(1)
  

La oss analysere definisjonen av funksjonen:

  • Funksjonen tar et tall n som argument.
  • Vi bruker `time.sleep(1)` for å introdusere en 1-sekund pause mellom hvert tall.
  • Når tellingen når 0, skriver funksjonen ut «Klar!».

Vi bruker `range()`-funksjonen med en negativ stegverdi `-1`. `range(n, -1, -1)` gjør at vi kan gå gjennom tallene n, n-1, n-2 og så videre ned til 0. Husk at sluttverdien ikke inkluderes med `range()`.

La oss kalle `countDown(5)`:

countDown(5)

Lagre som `countdown.py` og kjør programmet:

$ python3 countdown.py

`sleep()` med multitråding

Pythons `threading`-modul gir mulighet for multitråding. I Python er det imidlertid en global lås, GIL, som sikrer at kun en tråd kjører samtidig.

Ved I/O-operasjoner, som `sleep()`, kan prosessoren sette en tråd på pause og bytte til en annen tråd som venter.

Oppretting av tråder i Python

Tenk deg funksjonene `func1()`, `func2()` og `func3()`. Hver av disse itererer gjennom en rekke tall og skriver dem ut. Deretter introduseres en forsinkelse med `time.sleep()`. Vi bruker forskjellige forsinkelser i hver funksjon for å vise hvordan programutførelsen bytter mellom tråder:

import time
import threading

def func1():
    for i in range(5):
        print(f"Kjører t1, print {i}.")
        time.sleep(2)

def func2():
    for i  in range(5):
         print(f"Kjører t2, print {i}.")
         time.sleep(1)

def func3():
    for i in range(4):
         print(f"Kjører t3, print {i}.")
         time.sleep(0.5)

I Python kan man lage et trådobjekt med `threading.Thread()`. Syntaksen for dette er `threading.Thread(target = …, args = …)`, som oppretter en tråd som kjører `target`-funksjonen med argumentene angitt i `args`.

I vårt tilfelle har `func1`, `func2` og `func3` ingen argumenter. Derfor kan vi bare spesifisere funksjonsnavnet som `target` når vi oppretter tråder. Vi definerer trådobjektene `t1`, `t2` og `t3` med `func1`, `func2` og `func3` som mål:

t1 = threading.Thread(target=func1)
t2 = threading.Thread(target=func2)
t3 = threading.Thread(target=func3)

t1.start()
t2.start()
t3.start()
    

Her er hele koden:

  import time
  import threading

  def func1():
      for i in range(5):
          print(f"Kjører t1, print {i}.")
          time.sleep(2)

  def func2():
      for i  in range(5):
           print(f"Kjører t2, print {i}.")
           time.sleep(1)

  def func3():
      for i in range(4):
           print(f"Kjører t3, print {i}.")
           time.sleep(0.5)

  t1 = threading.Thread(target=func1)
  t2 = threading.Thread(target=func2)
  t3 = threading.Thread(target=func3)

  t1.start()
  t2.start()
  t3.start()
  

Legg merke til hvordan utførelsen veksler mellom de tre trådene. Tråd `t3` har den korteste ventetiden og vil derfor slippe raskest til. Tråd `t1` har den lengste ventetiden og vil være den siste som fullfører.

For mer informasjon om dette, se introduksjonen til multitråding i Python.

Oppsummering

I denne opplæringen har vi sett hvordan vi kan bruke `time.sleep()` til å legge inn forsinkelser i kode.

Vi har gått gjennom:

  • Hvordan du kan kalle `sleep()` fra `time`-modulen (`time.sleep()`).
  • Hvordan man forsinker utførelsen med et angitt antall sekunder (`time.sleep(n)`).
  • Hvordan man kan bruke `sleep()` i en løkke med variable forsinkelser.
  • Hvordan lage en nedtellingstidtaker.
  • Hvordan `sleep()` fungerer med multitråding.

Du kan nå utforske mer avanserte funksjoner i `time`-modulen. Hvis du vil jobbe med datoer og klokkeslett, kan du utforske `datetime` og `calendar`-modulene i tillegg.

Lær mer om hvordan du beregner tidsforskjell i Python.⏰