Jak dodać opóźnienia do kodu

Ten przewodnik wprowadzi Cię w tajniki stosowania funkcji `sleep()` z wbudowanej biblioteki czasu Pythona, umożliwiającej wprowadzenie przerw w działaniu Twojego programu.

Standardowo, kod w Pythonie realizowany jest krok po kroku, bez zatrzymywania się. Jednakże, w pewnych sytuacjach niezbędne jest spowolnienie tej sekwencji. W tym celu przydatna jest funkcja `sleep()`, dostępna w module `time` Pythona.

W tym opracowaniu poznasz reguły używania funkcji `sleep()` w Pythonie i zapoznasz się z przykładami, które pomogą Ci zrozumieć, jak to działa. Zaczynajmy!

Sposób użycia `time.sleep()` w Pythonie

Biblioteka czasu, która jest standardowym elementem Pythona, oferuje różne funkcje dotyczące czasu. Na początek, zaimportuj moduł `time` do swojego projektu:

import time

Ponieważ `sleep()` jest częścią biblioteki `time`, możesz ją wywołać w następujący sposób:

time.sleep(n) 

Tutaj `n` to czas trwania przerwy w sekundach. Może to być liczba całkowita lub zmiennoprzecinkowa.

Czasem potrzebne jest opóźnienie liczone w milisekundach. W takim przypadku, przekształć czas w milisekundach na sekundy i użyj tej wartości w wywołaniu funkcji. Na przykład, opóźnienie 100 milisekund zapiszesz jako `time.sleep(0.1)`, bo 0.1 sekundy to 100 milisekund.

▶ Alternatywnie, możesz zaimportować tylko funkcję `sleep` z modułu czasu:

from time import sleep

Importując w ten sposób, możesz bezpośrednio wywoływać `sleep()`, pomijając `time.sleep()`.

Teraz, gdy już wiesz, jak działa `sleep()` w Pythonie, przejdźmy do przykładów, które pokażą działanie tej funkcji. Skrypty używane w tym poradniku możesz znaleźć w folderze `python-sleep` w repozytorium GitHub. 👩🏽‍💻

Wstrzymywanie kodu z użyciem `sleep()`

Na początek, użyjemy funkcji `sleep`, aby opóźnić działanie prostego programu.

W tym fragmencie kodu:

  • Pierwsze `print()` wykona się od razu.
  • Następnie, wprowadzamy pauzę na 5 sekund za pomocą `sleep()`.
  • Drugie `print()` wykona się dopiero po zakończeniu pauzy.
# /python-sleep/simple_example.py
import time

print("Wyświetl teraz")
time.sleep(5)
print("Wyświetl po 5 sekundach przerwy")

Uruchom plik `simple_example.py` i obserwuj efekt:

$ python3 simple_example.py

Zastosowanie różnorodnych opóźnień w bloku kodu

Poprzedni przykład ilustrował stałą przerwę 5-sekundową. Teraz stworzymy przykład z różnymi czasami opóźnień w pętli.

Zrobimy następujące kroki:

  • Przejdziemy przez zdanie, pobierzemy każde słowo i je wyświetlimy.
  • Po wydrukowaniu każdego słowa, zatrzymamy się na pewien czas przed wyświetleniem kolejnego.

Przechodzenie przez ciąg znaków

Weźmy zdanie. Jest to sekwencja, gdzie każde słowo jest osobnym ciągiem znaków.

Jeśli przejdziemy przez zdanie, otrzymamy pojedyncze znaki:

>>> sentence = "Ile czasu to zajmie?"
>>> for char in sentence:
...     print(char)

# Wynik (skrócony)
I
l
e
.
.
.
j
m
i
e
?

Ale nie tego potrzebujemy. Chcemy przejść przez zdanie i pobrać każde słowo. Aby to zrobić, użyjemy metody `split()` na zdaniu. Metoda ta zwraca listę słów, uzyskanych przez podział zdania w miejscach, gdzie występują białe znaki.

>>> sentence.split()
['Ile', 'czasu', 'to', 'zajmie?']
>>> for word in sentence.split():
...     print(word)

# Wynik
Ile
czasu
to
zajmie?

Iterowanie po elementach z różnymi opóźnieniami

Wracamy do naszego przykładu:

  • `sentence` to zdanie, po którym chcemy iterować, aby pobrać każde słowo.
  • `delay_times` to lista czasów opóźnień, które użyjemy jako argumentu funkcji `sleep()` w każdej iteracji.

Chcemy przechodzić jednocześnie przez dwie listy: listę czasów opóźnień i listę słów ze zdania. Użyjemy funkcji `zip()`, aby to zrobić.

Funkcja `zip()` w Pythonie: `zip(lista1, lista2)` zwraca iterator krotek, gdzie każda krotka zawiera element o indeksie `i` z `lista1` i `lista2`.

# /python-sleep/delay_times.py
import time

sleep_times = [3,4,1.5,2,0.75]
sentence = "Ile czasu to zajmie?"
for sleep_time,word in zip(sleep_times,sentence.split()):
    print(word)
    time.sleep(sleep_time)

Bez funkcji `sleep()`, program od razu przechodziłby do kolejnej iteracji. Dzięki opóźnieniu, przejście następuje po zakończeniu przerwy.

Uruchom `delay_times.py` i obserwuj rezultat:

$ python3 delay_times.py

Słowa będą drukowane z przerwami. Opóźnienie po wydrukowaniu słowa o indeksie `i` w zdaniu, odpowiada wartości o indeksie `i` na liście `sleep_times`.

Minutnik w Pythonie

Teraz stworzymy prosty minutnik w Pythonie.

Zdefiniujmy funkcję `countDown()`:

# /python-sleep/countdown.py
import time

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

Analiza funkcji `countDown()`:

  • Funkcja przyjmuje liczbę `n` i odlicza do zera.
  • `time.sleep(1)` wprowadza sekundową przerwę między odliczeniami.
  • Gdy liczba osiągnie 0, program wypisze „Start!”.

🎯 Do odliczania użyliśmy funkcji `range()` z ujemnym krokiem -1. `range(n, -1, -1)` pozwala przejść przez zakres liczb `n`, `n – 1`, `n – 2` itd. aż do zera. Pamiętaj, że punkt końcowy nie jest domyślnie uwzględniany przy korzystaniu z `range()`.

Dodajmy wywołanie funkcji `countDown()` z argumentem 5.

countDown(5)

Teraz uruchom `countdown.py` i zobacz działanie minutnika!

$ python3 countdown.py

Funkcja `sleep` w wielowątkowości

Moduł `threading` w Pythonie umożliwia wielowątkowość. W Pythonie, Global Interpreter Lock (GIL) zapewnia, że w danym momencie działa tylko jeden wątek.

Jednak podczas operacji we/wy i oczekiwania, jak `sleep()`, procesor może wstrzymać bieżący wątek i przejść do innego.

Aby to zrozumieć, przeanalizujmy przykład.

Tworzenie i uruchamianie wątków w Pythonie

Weźmy pod uwagę funkcje `func1()`, `func2()` i `func3()`. Przechodzą one przez zakres liczb i je wyświetlają. Następnie następuje `sleep()` na określony czas w każdej pętli. Użyliśmy różnych czasów opóźnień, aby zobaczyć, jak przełączanie się między wątkami działa.

import time
import threading

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

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

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

W Pythonie, konstruktor `Thread()` tworzy instancję obiektu wątku. Używając `threading.Thread(target = …, args = …)`, tworzysz wątek, który uruchamia funkcję o nazwie `target`, z argumentami określonymi w krotce `args`.

W naszym przykładzie `func1`, `func2` i `func3` nie przyjmują argumentów. Wystarczy podać tylko nazwę funkcji jako cel. Następnie tworzymy obiekty wątków `t1`, `t2` i `t3` z celami odpowiednio `func1`, `func2` i `func3`.

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

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

Oto pełny kod:

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

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

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

def func3():
    for i in range(4):
         print(f"Wątek t3, druk {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()

Obserwuj wynik. Wykonanie zmienia się pomiędzy trzema wątkami. Wątek `t3` ma najkrótszy czas oczekiwania, więc najkrócej jest zawieszony. Wątek `t1` ma najdłuższy czas uśpienia, więc kończy działanie jako ostatni.

Jeśli chcesz dowiedzieć się więcej o wielowątkowości w Pythonie, zapoznaj się z naszym poradnikiem.

Podsumowanie

W tym przewodniku nauczyłeś się dodawać opóźnienia do kodu Pythona za pomocą `sleep()`.

Funkcja `sleep()` jest dostępna w `time.sleep()`. Aby opóźnić wykonanie o `n` sekund, użyj `time.sleep(n)`. Poznałeś też przykłady opóźniania iteracji w pętli, odliczania i wielowątkowości.

Możesz teraz poznać bardziej zaawansowane funkcje modułu `time`. Chcesz pracować z datami i godzinami w Pythonie? Oprócz modułu `time`, możesz użyć modułów `datetime` i `calendar`.

Następnie dowiedz się, jak obliczać różnice czasu w Pythonie. ⏰


newsblog.pl