Jak přidat zpoždění do kódu
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:
sentenceje řetězec, kterým chceme iterovat a získávat jednotlivá slova.delay_timesje seznam prodlev, které použijeme jako argument funkcesleep()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
na 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. ⏰