Jak dodać opóźnienia do kodu

Ten samouczek nauczy Cię, jak używać funkcji sleep() z wbudowanego modułu czasu Pythona, aby dodawać opóźnienia czasowe do kodu.

Kiedy uruchamiasz prosty program w Pythonie, wykonywanie kodu odbywa się sekwencyjnie — jedna instrukcja po drugiej — bez żadnych opóźnień czasowych. Jednak w niektórych przypadkach może być konieczne opóźnienie wykonania kodu. Pomaga w tym funkcja sleep() z wbudowanego modułu czasu Pythona.

W tym samouczku poznasz składnię używania funkcji sleep() w Pythonie i poznasz kilka przykładów, aby zrozumieć, jak to działa. Zacznijmy!

Składnia Pythona time.sleep()

Moduł czasu, wbudowany w standardową bibliotekę Pythona, udostępnia kilka przydatnych funkcji związanych z czasem. W pierwszej kolejności zaimportuj moduł czasu do swojego środowiska pracy:

import time

Ponieważ funkcja sleep() jest częścią modułu time, możesz teraz uzyskać do niej dostęp i używać jej z następującą ogólną składnią:

time.sleep(n) 

Tutaj n to liczba sekund do snu. Może to być liczba całkowita lub liczba zmiennoprzecinkowa.

Czasami wymagane opóźnienie może wynosić kilka milisekund. W takich przypadkach można przekonwertować czas trwania w milisekundach na sekundy i użyć go w wywołaniu funkcji uśpienia. Na przykład, jeśli chcesz wprowadzić opóźnienie 100 milisekund, możesz określić je jako 0,1 sekundy: time.sleep(0.1).

▶ Możesz także zaimportować tylko funkcję uśpienia z modułu czasu:

from time import sleep

Jeśli użyjesz powyższej metody importowania, możesz bezpośrednio wywołać funkcję sleep() — bez użycia time.sleep().

Teraz, gdy znasz już składnię funkcji sleep() w języku Python, utwórzmy przykłady kodu, aby zobaczyć tę funkcję w działaniu. Możesz pobrać skrypty języka Python używane w tym samouczku z folderu python-sleep w tym repozytorium GitHub. 👩🏽‍💻

Opóźnij wykonanie kodu za pomocą funkcji sleep()

Jako pierwszy przykład użyjmy funkcji uśpienia, aby opóźnić wykonanie prostego programu w Pythonie.

W poniższym fragmencie kodu:

  • Pierwsza instrukcja print() jest wykonywana bez żadnego opóźnienia.
  • Następnie wprowadzamy opóźnienie 5 sekund za pomocą funkcji sleep().
  • Druga instrukcja print() zostanie wykonana dopiero po zakończeniu operacji uśpienia.
# /python-sleep/simple_example.py
import time

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

Teraz uruchom plik simple_example.py i obserwuj wynik:

$ python3 simple_example.py

Dodaj różne opóźnienia do bloku kodu

W poprzednim przykładzie wprowadziliśmy stałe opóźnienie wynoszące 5 sekund między wykonaniem dwóch instrukcji print(). Następnie zakodujmy inny przykład, aby wprowadzić różne czasy opóźnienia podczas zapętlania przez obiekt iterowalny.

W tym przykładzie chcielibyśmy wykonać następujące czynności:

  • Przejrzyj zdanie, uzyskaj dostęp do każdego słowa i wydrukuj je.
  • Po wydrukowaniu każdego słowa chcielibyśmy odczekać określony czas — przed wydrukowaniem następnego słowa w zdaniu.

Zapętlanie przez łańcuch ciągów

Rozważ ciąg, zdanie. Jest to ciąg, w którym każde słowo jest ciągiem samym w sobie.

Jeśli przejdziemy przez łańcuch, otrzymamy każdy znak, jak pokazano:

>>> 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 nie jest to, czego chcemy. Chcielibyśmy przejść przez zdanie i uzyskać dostęp do każdego słowa. Aby to zrobić, możemy wywołać metodę split() na łańcuchu zdań. Spowoduje to zwrócenie listy ciągów — uzyskanej przez podzielenie ciągu zdania — dla wszystkich wystąpień białych znaków.

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

# Output
How
long
will
this
take?

Zapętlanie elementów iteracyjnych z różnymi opóźnieniami

Wróćmy do przykładu:

  • zdanie to łańcuch, przez który chcielibyśmy przejść w pętli, aby uzyskać dostęp do każdego słowa.
  • delay_times to lista czasów opóźnienia, których użyjemy jako argumentu funkcji sleep() podczas każdego przejścia przez pętlę.

Tutaj chcielibyśmy jednocześnie przejść przez dwie listy: listę opóźnień_czasów i listę ciągów otrzymanych przez podzielenie ciągu zdań. Możesz użyć funkcji zip() do wykonania tej równoległej iteracji.

Funkcja zip() w Pythonie: zip(list1, list2) zwraca iterator krotek, gdzie każda krotka zawiera element o indeksie i na listach list1 i list2.

# /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 funkcji uśpienia sterowanie natychmiast przeszłoby do następnej iteracji. Ponieważ wprowadziliśmy opóźnienie, następne przejście przez pętlę następuje dopiero po zakończeniu operacji uśpienia.

Teraz uruchom delay_times.py i obserwuj wynik:

$ python3 delay_times.py

Kolejne słowa w łańcuchu zostaną wydrukowane z opóźnieniem. Opóźnienie po wydrukowaniu słowa o indeksie i w łańcuchu jest liczbą o indeksie i na liście czasy_opóźnienia.

Minutnik w Pythonie

Jako następny przykład zakodujmy 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("Ready to go!")
        else:
             print(i)
             time.sleep(1)

Następnie przeanalizujmy definicję funkcji countDown():

  • Funkcja przyjmuje liczbę n jako argument i odlicza do zera, zaczynając od tej liczby n.
  • Używamy time.sleep(1), aby uzyskać jednosekundowe opóźnienie między zliczeniami.
  • Kiedy liczba osiągnie 0, funkcja wypisze komunikat „Gotowy do pracy!”.

🎯 Aby wykonać operację odliczania, użyliśmy funkcji range() z ujemną wartością kroku -1. range(n, -1, -1) pomoże nam przejść przez zakres liczb w n, n – 1, n – 2 i tak dalej, aż do zera. Przypomnij sobie, że punkt końcowy jest domyślnie wykluczony podczas korzystania z funkcji range().

Następnie dodajmy wywołanie funkcji countDown() z argumentem 5.

countDown(5)

Teraz uruchom skrypt countdown.py i zobacz działanie funkcji countDown!

$ python3 countdown.py

Funkcja uśpienia w wielowątkowości

Moduł wątków Pythona oferuje gotowe możliwości wielowątkowości. W Pythonie Global Interpreter Lock lub GIL zapewnia, że ​​w dowolnym momencie działa tylko jeden aktywny wątek.

Jednak podczas operacji we/wy i operacji oczekiwania, takich jak uśpienie, procesor może zawiesić wykonywanie bieżącego wątku i przełączyć się do innego oczekującego wątku.

Aby zrozumieć, jak to działa, weźmy przykład.

Tworzenie i uruchamianie wątków w Pythonie

Rozważ następujące funkcje, func1(), func2() i func3(). Przechodzą przez szereg liczb i drukują je. Po tym następuje operacja uśpienia — na określoną liczbę sekund — podczas każdego przejścia przez pętlę. Użyliśmy różnych czasów opóźnienia dla każdej z funkcji, aby lepiej zrozumieć, w jaki sposób wykonanie przełącza się między wątkami jednocześnie.

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)

W Pythonie możesz użyć konstruktora Thread() do utworzenia instancji obiektu wątku. Używając składni threading.Thread(target = …, args = …) tworzy wątek, który uruchamia funkcję docelową z argumentem określonym w krotce args.

W tym przykładzie funkcje func1, func2 i func3 nie przyjmują żadnych argumentów. Wystarczy więc podać jako cel tylko nazwę funkcji. Następnie definiujemy obiekty wątku, 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 przykładu wątkowania:

# /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()

Obserwuj wyjście. Wykonanie zmienia się między trzema wątkami. Wątek t3 ma najkrótszy czas oczekiwania, więc jest zawieszany na najkrótszy czas. Wątek t1 ma najdłuższy czas uśpienia wynoszący dwie sekundy, więc jest to ostatni wątek, który kończy wykonywanie.

Aby dowiedzieć się więcej, przeczytaj samouczek dotyczący podstaw wielowątkowości w Pythonie.

Wniosek

W tym samouczku nauczyłeś się, jak używać funkcji sleep() języka Python do dodawania opóźnień czasowych do kodu.

Dostęp do funkcji sleep() można uzyskać z wbudowanego modułu czasu, time.sleep(). Aby opóźnić wykonanie o n sekund, użyj time.sleep(n). Widziałeś też przykłady opóźniania kolejnych iteracji w pętli przez różne wartości, odliczanie i wielowątkowość.

Możesz teraz zapoznać się z bardziej zaawansowanymi możliwościami modułu czasu. Chcesz pracować z datami i godzinami w Pythonie? Oprócz modułu czasu możesz wykorzystać funkcjonalność modułów daty i godziny oraz kalendarza.

Następnie naucz się obliczać różnicę czasu w Pythonie.⏰