Jak osiągnąć wielowątkowość w Pythonie?

Wielowątkowość (multi-threading) w Pythonie jest techniką, która pozwala na wykonanie kilku fragmentów kodu jednocześnie, co może prowadzić do efektywniejszego wykorzystania zasobów i szybszego przetwarzania. Python oferuje kilka sposobów na implementację wielowątkowości, głównie poprzez moduł threading.

Przykład kodu z wielowątkowością

Przyjrzymy się przykładowi użycia modułu threading do uruchomienia dwóch funkcji jednocześnie:

import threading
import time

# Funkcja, która symuluje ciężkie obliczenia
def heavy_computing(name):
    # Wypisanie informacji o rozpoczęciu zadania
    print(f"Zadanie {name} rozpoczęte")
    # Symulacja długotrwałego zadania przez uśpienie wątku
    time.sleep(2)
    # Wypisanie informacji o zakończeniu zadania
    print(f"Zadanie {name} zakończone")

# Utworzenie wątków
thread1 = threading.Thread(target=heavy_computing, args=("A",))
thread2 = threading.Thread(target=heavy_computing, args=("B",))

# Uruchomienie wątków
thread1.start()
thread2.start()

# Oczekiwanie na zakończenie wątków
thread1.join()
thread2.join()

print("Wszystkie zadania zakończone.")

Opis działania

  • Import modułów: Na początku importowany jest moduł threading, który umożliwia wielowątkowość, oraz moduł time do symulacji długotrwałych operacji.
  • Definicja funkcji: Funkcja heavy_computing symuluje wykonanie ciężkiego zadania, wykorzystując funkcję sleep do uśpienia wątku, co imituje długotrwałe obliczenia.
  • Tworzenie wątków: Dwa wątki są tworzone przez instancjonowanie obiektów klasy Thread z modułu threading, przekazując funkcję heavy_computing jako cel (target) oraz argumenty dla tej funkcji.
  • Uruchamianie wątków: Metoda start uruchamia wątki, które wykonują przypisaną im funkcję.
  • Czekanie na zakończenie: Metoda join powoduje, że wątek główny czeka na zakończenie wątków potomnych, zapewniając, że program nie zakończy się, dopóki wszystkie wątki nie zakończą swojego działania.

Wielowątkowość a GIL w Pythonie

Warto wspomnieć o Global Interpreter Lock (GIL), mechanizmie specyficznym dla implementacji CPython, który zapobiega jednoczesnemu wykonywaniu wielu wątków Pythona. Oznacza to, że nawet jeśli używasz wielu wątków, w danym momencie tylko jeden wątek może wykonywać kod Pythona. Chociaż może to brzmieć jak ograniczenie, w praktyce wielowątkowość w Pythonie jest bardzo użyteczna do operacji wejścia-wyjścia (I/O) i innych operacji, które są ograniczone przez zewnętrzne systemy lub urządzenia, ponieważ GIL jest zwalniany podczas operacji I/O, co pozwala innym wątkom na wykonanie pracy.

Kiedy używać wielowątkowości?

Wielowątkowość jest szczególnie przydatna w aplikacjach, które wymagają jednoczesnego przetwarzania wielu zadań niezależnie od siebie, takich jak:

  • Aplikacje sieciowe (np. serwery), gdzie obsługa wielu połączeń jednocześnie jest kluczowa.
  • Aplikacje z GUI, gdzie niezależny wątek może być używany do utrzymania responsywności interfejsu użytkownika podczas wykonywania długotrwałych operacji w tle.
  • Programy wykonujące wiele operacji I/O, które mogą być łatwo zrównoleglone, takie jak pobieranie plików z Internetu.

Podsumowanie

Wielowątkowość w Pythonie oferuje potężne narzędzie do tworzenia aplikacji, które mogą efektywnie zarządzać wieloma zadaniami jednocześnie. Dzięki modułowi threading, programiści mogą łatwo tworzyć i zarządzać wieloma wątkami, co pozwala na zwiększenie wydajności aplikacji w określonych scenariuszach. Jednak ważne jest, aby mieć na uwadze ograniczenia związane z GIL podczas projektowania aplikacji wielowątkowych w Pythonie, zwłaszcza gdy wymagane jest intensywne obliczeniowo przetwarzanie danych. W takich przypadkach warto rozważyć alternatywne podejścia, takie jak programowanie asynchroniczne lub wykorzystanie procesów zamiast wątków, które omijają ograniczenia GIL.

Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs video Python w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.

Scroll to Top