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 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
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. ⏰