Jak přidat zpoždění do kódu

Photo of author

By etechblogcz

Jak využít funkci sleep() v Pythonu pro vložení časových prodlev

V tomto návodu se dozvíte, jak přidávat časové prodlevy do svého kódu pomocí funkce sleep(), která je součástí standardního modulu time v Pythonu.

Běžný Python skript se spouští sekvenčně, řádek po řádku, bez jakéhokoli zpoždění. Někdy je však potřeba provedení kódu pozdržet. V takovém případě vám skvěle poslouží právě funkce sleep() z časového modulu.

V následujícím textu si objasníme syntaxi použití sleep() a probereme několik praktických příkladů, abyste pochopili, jak tato funkce funguje. Začněme!

Syntaxe funkce time.sleep() v Pythonu

Časový modul, který je součástí standardní knihovny Pythonu, obsahuje množství užitečných funkcí pro práci s časem. Prvním krokem je import tohoto modulu do vašeho prostředí:

import time

Funkce sleep() je součástí modulu time, takže ji můžete volat pomocí následující obecné syntaxe:

time.sleep(n)

Zde n představuje počet sekund, po které má program „spát“. Může to být celé číslo nebo číslo s plovoucí desetinnou čárkou.

Někdy může být potřeba prodleva v řádu milisekund. V takovém případě je nutné převést milisekundy na sekundy a tuto hodnotu použít ve funkci sleep(). Například pro 100 milisekund použijte time.sleep(0.1).

▶ Je možné importovat pouze funkci sleep() z časového modulu:

from time import sleep

Pokud použijete tento způsob importu, můžete volat funkci sleep() přímo, bez prefixu time..

Nyní, když už znáte syntaxi funkce sleep(), pojďme si ji ukázat v praxi na několika příkladech. Skripty použité v tomto tutoriálu si můžete stáhnout ze složky python-sleep na GitHubu. 👩🏽‍💻

Odložení spuštění kódu pomocí funkce sleep()

V prvním příkladu si ukážeme, jak sleep() použít pro zpoždění jednoduchého Python programu.

V následujícím kódu:

  • První příkaz print() se provede okamžitě.
  • Poté vkládáme 5sekundové zpoždění pomocí funkce sleep().
  • Druhý příkaz print() se provede až po uplynutí prodlevy.
# /python-sleep/simple_example.py
import time

print("Vytisknout hned")
time.sleep(5)
print("Vytisknout po 5 sekundách spánku")

Spusťte skript simple_example.py a pozorujte výstup:

$ python3 simple_example.py

Vložení různých zpoždění do bloku kódu

V předchozím příkladu jsme použili pevnou 5sekundovou prodlevu. Nyní si ukážeme, jak vkládat různá zpoždění v cyklu.

V tomto příkladu chceme:

  • Procházet větu, získat každé slovo a vypsat ho.
  • Po vypsání každého slova počkat určitou dobu před vypsáním následujícího slova.

Procházení sekvencí řetězců

Uvažujme větu, která je sama o sobě řetězcem, kde jednotlivá slova jsou také řetězce.

Pokud bychom procházeli větu jako řetězec, dostali bychom jednotlivé znaky, jak je vidět zde:

>>> sentence = "Jak dlouho to bude trvat?"
>>> for char in sentence:
...     print(char)

# Výstup (zkráceno)
J
a
k
.
.
.
t
r
v
a
t
?

To ale není to, co chceme. Potřebujeme procházet slova ve větě. K tomu použijeme metodu split(), která vrátí seznam slov získaný rozdělením věty podle mezer.

>>> sentence.split()
['Jak', 'dlouho', 'to', 'bude', 'trvat?']
>>> for word in sentence.split():
...     print(word)

# Výstup
Jak
dlouho
to
bude
trvat?

Procházení iterovatelných objektů s různými prodlevami

Vraťme se k příkladu:

  • sentence je řetězec, kterým chceme iterovat a získávat jednotlivá slova.
  • delay_times je seznam prodlev, které použijeme jako argument funkce sleep() v každé iteraci.

Zde potřebujeme procházet dva seznamy paralelně: seznam delay_times a seznam slov získaný z věty. K tomu použijeme funkci zip().

Funkce zip() v Pythonu zip(seznam1, seznam2) vrací iterátor n-tic, kde každá n-tice obsahuje prvek na indexu i ze seznamů seznam1 a seznam2.

# /python-sleep/delay_times.py
import time

sleep_times = [3, 4, 1.5, 2, 0.75]
sentence = "Jak dlouho to bude trvat?"
for sleep_time, word in zip(sleep_times, sentence.split()):
    print(word)
    time.sleep(sleep_time)

Bez funkce sleep() by řízení přešlo ihned k další iteraci. Protože jsme vložili prodlevu, k další iteraci dojde až po jejím uplynutí.

Spusťte delay_times.py a pozorujte výstup:

$ python3 delay_times.py

Slova se vypisují s odstupem. Zpoždění po vypsání slova na indexu i v řetězci odpovídá číslu na indexu i v seznamu delay_times.

Odpočítávací časovač v Pythonu

Jako další příklad si vytvoříme jednoduchý odpočítávací časovač.

Definujme funkci countDown():

# /python-sleep/countdown.py
import time

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

Nyní si projděme definici funkce countDown():

  • Funkce bere jako argument číslo n a od tohoto čísla odpočítává k nule.
  • Pomocí time.sleep(1) dosáhneme jednosekundové prodlevy mezi jednotlivými čísly.
  • Když se odpočet dostane k 0, vypíše se „Připraveno!“.

🎯 Pro odpočet používáme funkci range() se záporným krokem -1. range(n, -1, -1) nám umožní procházet čísla v rozsahu n, n – 1, n – 2 a tak dále až k nule. Pamatujte, že koncová hodnota ve funkci range() je vyloučena.

Nyní přidáme volání funkce countDown() s argumentem 5.

countDown(5)

Spusťte countdown.py a podívejte se, jak funkce countDown pracuje!

$ python3 countdown.py

Funkce sleep() v multithreadingu

Modul pro vytváření vláken v Pythonu nabízí předdefinované možnosti pro multithreading. V Pythonu zajišťuje Global Interpreter Lock (GIL), že v daný okamžik běží pouze jedno aktivní vlákno.

Nicméně během I/O operací a čekacích operací, jako je sleep(), může procesor pozastavit aktuální vlákno a přepnout na jiné čekající vlákno.

Abychom pochopili, jak to funguje, ukážeme si příklad.

Vytváření a spouštění vláken v Pythonu

Uvažujme funkce func1(), func2() a func3(). Tyto funkce procházejí sekvencí čísel a vypisují je. Poté následuje volání sleep() na určitý počet sekund v každé iteraci. Použili jsme rozdílné prodlevy, abychom lépe viděli, jak se vlákna přepínají.

import time

def func1():
    for i in range(5):
        print(f"Běží t1, tisk {i}.")
        time.sleep(2)

def func2():
    for i in range(5):
         print(f"Běží t2, tisk {i}.")
         time.sleep(1)


def func3():
    for i in range(4):
         print(f"Běží t3, tisk {i}.")
         time.sleep(0.5)

V Pythonu můžete použít konstruktor Thread() pro vytvoření instance objektu vlákna. Pomocí syntaxe threading.Thread(target = ..., args = ...) vytvoříme vlákno, které spustí cílovou funkci s argumentem v n-tici args.

V tomto příkladu funkce func1, func2 a func3 nemají argumenty. Stačí tedy pouze uvést název funkce jako cíl. Potom definujeme objekty vláken t1, t2 a t3 s funkcemi func1, func2 a func3 jako cíli.

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

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

Zde je celý kód pro příklad s vlákny:

# /python-sleep/threads.py
import time
import threading

def func1():
    for i in range(5):
        print(f"Běží t1, tisk {i}.")
        time.sleep(2)

def func2():
    for i in range(5):
         print(f"Běží t2, tisk {i}.")
         time.sleep(1)

def func3():
    for i in range(4):
         print(f"Běží t3, tisk {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()

Sledujte výstup. Provádění se přepíná mezi třemi vlákny. Vlákno t3 má nejkratší dobu čekání, a tak je pozastaveno nejkratší dobu. Vlákno t1 má nejdelší dobu spánku (2 sekundy) a dokončí se jako poslední.

Chcete-li se dozvědět více, přečtěte si tutoriál o základech multithreadingu v Pythonu.

Závěr

V tomto tutoriálu jste se naučili, jak pomocí funkce sleep() z modulu time přidávat časové prodlevy do kódu.

Funkci sleep() voláte jako time.sleep(n), kde n je počet sekund, po které se má program pozastavit. Viděli jste také příklady prodlev v cyklech, odpočítávání a multithreadingu.

Nyní můžete prozkoumat pokročilejší možnosti modulu time. Chcete pracovat s daty a časy v Pythonu? Kromě time můžete využít i funkcionalitu modulů datetime a calendar.

Dále se naučte, jak v Pythonu vypočítat časové rozdíly. ⏰