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

Tento tutoriál vás naučí, jak používat funkci sleep() z vestavěného časového modulu Pythonu k přidání časových zpoždění do kódu.

Když spustíte jednoduchý program Python, spustí se kód sekvenčně – jeden příkaz za druhým – bez jakéhokoli časového zpoždění. V některých případech však možná budete muset zpozdit provádění kódu. K tomu vám pomůže funkce sleep() z vestavěného časového modulu Pythonu.

V tomto tutoriálu se naučíte syntaxi použití funkce sleep() v Pythonu a několik příkladů, abyste pochopili, jak funguje. Začněme!

Syntaxe Pythonu time.sleep()

Časový modul vestavěný do standardní knihovny Pythonu poskytuje několik užitečných funkcí souvisejících s časem. Jako první krok importujte časový modul do vašeho pracovního prostředí:

import time

Protože funkce sleep() je součástí časového modulu, můžete k ní nyní přistupovat a používat ji s následující obecnou syntaxí:

time.sleep(n) 

Zde n je počet sekund do spánku. Může to být celé číslo nebo číslo s plovoucí desetinnou čárkou.

Někdy může být požadované zpoždění několik milisekund. V těchto případech můžete dobu trvání v milisekundách převést na sekundy a použít ji při volání funkce spánku. Chcete-li například zavést zpoždění 100 milisekund, můžete jej zadat jako 0,1 sekundy: time.sleep(0,1).

▶ Můžete také importovat pouze funkci spánku z časového modulu:

from time import sleep

Pokud pro import použijete výše uvedenou metodu, můžete funkci sleep() zavolat přímo – bez použití time.sleep().

Nyní, když jste se naučili syntaxi funkce sleep() v Pythonu, pojďme si naprogramovat příklady, abyste viděli funkci v akci. Skripty Pythonu použité v tomto tutoriálu si můžete stáhnout ze složky python-sleep v tomto úložišti GitHub. 👩🏽‍💻

  Jak odstranit vodorovnou čáru v MS Word

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

Jako první příklad použijeme funkci spánku ke zpoždění spuštění jednoduchého programu v Pythonu.

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

  • První příkaz print() se provede bez jakéhokoli zpoždění.
  • Poté zavedeme zpoždění 5 sekund pomocí funkce sleep().
  • Druhý příkaz print() bude proveden až po dokončení operace spánku.
# /python-sleep/simple_example.py
import time

print("Print now")
time.sleep(5)
print("Print after sleeping for 5 seconds")

Nyní spusťte soubor simple_example.py a sledujte výstup:

$ python3 simple_example.py

Přidejte různá zpoždění do bloku kódu

V předchozím příkladu jsme zavedli pevnou prodlevu 5 sekund mezi provedením dvou příkazů print(). Dále nakódujme další příklad pro zavedení různých časů zpoždění při opakování opakování.

V tomto příkladu bychom chtěli provést následující:

  • Projděte si větu, získejte přístup ke každému slovu a vytiskněte je.
  • Po vytištění každého slova bychom rádi počkali určitou dobu – než vytiskneme další slovo ve větě.

Procházení řetězcem řetězců

Zvažte řetězec, větu. Je to řetězec, kde každé slovo je řetězcem samo o sobě.

Pokud procházíme řetězec, získáme každý znak, jak je znázorněno:

>>> sentence = "How long will this take?"
>>> for char in sentence:
...     print(char)

# Output (truncated for readability)
H
o
w
.
.
.
t
a
k
e
?

Ale to není to, co chceme. Rádi bychom procházeli větou a získali přístup ke každému slovu. K tomu můžeme zavolat metodu split() na řetězci věty. Tím se vrátí seznam řetězců – získaný rozdělením řetězce vět – u všech výskytů mezer.

>>> sentence.split()
['How', 'long', 'will', 'this', 'take?']
>>> for word in sentence.split():
...     print(word)

# Output
How
long
will
this
take?

Procházení iterables s různými zpožděními

Vraťme se k příkladu:

  • věta je řetězec, kterým bychom chtěli procházet, abychom získali přístup ke každému slovu.
  • delay_times je seznam časů zpoždění, které použijeme jako argument funkce sleep() během každého průchodu smyčkou.

Zde bychom chtěli současně procházet dvěma seznamy: seznam delay_times a seznam řetězců získaný rozdělením řetězce vět. K provedení této paralelní iterace můžete použít funkci zip().

  Off-line generátor hesel a trezor

Funkce zip() v Pythonu: zip(seznam1, seznam2) vrací iterátor n-tic, kde každá n-tice obsahuje položku na indexu i v seznamech1 a seznam2.

# /python-sleep/delay_times.py
import time

sleep_times = [3,4,1.5,2,0.75]
sentence = "How long will this take?"
for sleep_time,word in zip(sleep_times,sentence.split()):
    print(word)
    time.sleep(sleep_time)

Bez funkce spánku by řízení okamžitě přešlo k další iteraci. Protože jsme zavedli zpoždění, k dalšímu průchodu smyčkou dojde až po dokončení operace spánku.

Nyní spusťte delay_times.py a sledujte výstup:

$ python3 delay_times.py

Následující slova v řetězci budou vytištěna s určitou prodlevou. Zpoždění po vytištění slova na indexu i v řetězci je číslo na indexu i v seznamu delay_times.

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

Jako další příklad si nakódujme jednoduchý odpočítávací časovač v Pythonu.

Pojďme definovat funkci countDown():

# /python-sleep/countdown.py
import time

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

Dále analyzujme definici funkce countDown():

  • Funkce převezme jako argument číslo n a počínaje tímto číslem n počítá dolů k nule.
  • Pomocí time.sleep(1) dosáhneme prodlevy jedné sekundy mezi jednotlivými počty.
  • Když počet dosáhne 0, funkce vypíše „Připraveno!“.

🎯 K dosažení operace odpočítávání jsme použili funkci range() se zápornou hodnotou kroku -1. range(n, -1, -1) nám pomůže procházet rozsahem čísel v n, n – 1, n – 2 a tak dále až k nule. Připomeňme, že při použití funkce range() je koncový bod ve výchozím nastavení vyloučen.

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

countDown(5)

Nyní spusťte skript countdown.py a podívejte se na funkci countDown v akci!

$ python3 countdown.py

Funkce spánku v multithreadingu

Modul pro vytváření vláken v Pythonu nabízí předdefinované možnosti multithreadingu. V Pythonu zajišťuje Global Interpreter Lock nebo GIL, že v každém okamžiku běží pouze jedno aktivní vlákno.

Během I/O operací a operací čekání, jako je spánek, však může procesor pozastavit provádění aktuálního vlákna a přepnout na jiné vlákno, které čeká.

Abychom pochopili, jak to funguje, uveďme si příklad.

  8 nejlepších tvůrců ER diagramů pro vizualizaci a návrh databází

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

Zvažte následující funkce, func1(), func2() a func3(). Procházejí řadou čísel a vytisknou je. Poté následuje operace spánku – na určitý počet sekund – během každého průchodu smyčkou. Použili jsme různé doby zpoždění pro každou z funkcí, abychom lépe pochopili, jak se provádění přepíná mezi vlákny souběžně.

import time

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

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


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

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

V tomto příkladu funkce func1, func2 a func3 neberou žádné argumenty. Stačí tedy jako cíl uvést pouze název funkce. Poté 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 úplný kód pro příklad vlákna:

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

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

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

def func3():
    for i in range(4):
         print(f"Running 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()

Sledujte výstup. Provedení se mění mezi třemi vlákny. Vlákno t3 má nejnižší čekací dobu, takže je pozastaveno na nejkratší dobu. Vlákno t1 má nejdelší dobu spánku dvě sekundy, takže je to poslední vlákno, které dokončí provádění.

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 používat funkci sleep() Pythonu k přidání časových zpoždění do kódu.

K funkci sleep() se dostanete z vestavěného časového modulu time.sleep(). Chcete-li zpozdit provedení o n sekund, použijte time.sleep(n). Také jste viděli příklady zpoždění následných iterací ve smyčce o různé hodnoty, odpočítávání a vícevláknové zpracování.

Nyní můžete prozkoumat pokročilejší možnosti časového modulu. Chcete pracovat s daty a časy v Pythonu? Kromě časového modulu můžete využít funkcionalitu modulu datetime a kalendáře.

Dále se naučte vypočítat časový rozdíl v Pythonu.⏰