Wątkowanie i przetwarzanie wieloprocesowe w Pythonie dla początkujących

W Pythonie obsługa zadań współbieżnych może znacznie zwiększyć wydajność aplikacji, zwłaszcza w przypadku operacji związanych z wejściem/wyjściem lub procesorem. Python udostępnia dwa główne moduły dla współbieżności: threading i multiprocessing. Ten artykuł zapozna Cię z tymi modułami i wyjaśni, jak ich używać do programowania współbieżnego.

Zrozumienie wątków

Wątkowanie to sposób na jednoczesne uruchamianie wielu wątków (mniejszych jednostek procesu) w ramach jednego procesu. Jest to przydatne w przypadku zadań związanych z wejściem/wyjściem, w których spędzasz dużo czasu, czekając na zasoby zewnętrzne (np. wejście/wyjście pliku, żądania sieciowe).

Podstawowy przykład wątków

Aby tworzyć i zarządzać wątkami w Pythonie, należy użyć modułu threading. Oto prosty przykład:

import threading

# Define a function to be run in a thread
def print_numbers():
    for i in range(5):
        print(i)

# Create a thread object
thread = threading.Thread(target=print_numbers)

# Start the thread
thread.start()

# Wait for the thread to complete
thread.join()

print("Thread has finished execution")

Zrozumienie przetwarzania wieloprocesowego

Multiprocessing pozwala na jednoczesne uruchamianie wielu procesów, każdy z własnym interpreterem Pythona i przestrzenią pamięci. Jest to szczególnie przydatne w przypadku zadań związanych z procesorem, w których trzeba wykonywać obliczenia równolegle.

Podstawowy przykład przetwarzania wieloprocesowego

Moduł multiprocessing służy do tworzenia i zarządzania oddzielnymi procesami. Oto prosty przykład:

import multiprocessing

# Define a function to be run in a process
def compute_square(number):
    print(f"The square of {number} is {number * number}")

# Create a process object
process = multiprocessing.Process(target=compute_square, args=(5,))

# Start the process
process.start()

# Wait for the process to complete
process.join()

print("Process has finished execution")

Porównanie wątków i przetwarzania wieloprocesorowego

  • Threading: Najlepsze dla zadań związanych z wejściem/wyjściem. Wątki współdzielą tę samą przestrzeń pamięci i mogą być bardziej wydajne w przypadku operacji wymagających oczekiwania.
  • Multiprocessing: Najlepsze dla zadań wymagających dużej mocy obliczeniowej procesora. Procesy działają w oddzielnych przestrzeniach pamięci i mogą w pełni wykorzystywać wiele rdzeni procesora do zadań wymagających dużej mocy obliczeniowej.

Typowe przypadki użycia

  • Wątki: Nadaje się do zadań takich jak scrapowanie stron internetowych, operacje wejścia/wyjścia na plikach lub wszelkie zadania wymagające oczekiwania na zasoby zewnętrzne.
  • Wieloprocesorowość: idealna do przetwarzania danych, obliczeń matematycznych lub wszelkich zadań wymagających znacznych zasobów procesora.

Wniosek

Zarówno threading, jak i multiprocessing to potężne narzędzia do poprawy wydajności i efektywności aplikacji Python. Rozumiejąc, kiedy i jak używać tych modułów, możesz pisać bardziej efektywne i responsywne programy. Niezależnie od tego, czy masz do czynienia z zadaniami ograniczonymi przez I/O, czy obliczeniami ograniczonymi przez CPU, Python zapewnia narzędzia potrzebne do efektywnego radzenia sobie ze współbieżnością.