Multithreading in Python: threading und multiprocessing

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einführung in Multithreading und Multiprocessing in Python

Bei der Entwicklung moderner Anwendungen ist es oft notwendig, die Leistung zu steigern. Dies wird durch die parallele Ausführung von Aufgaben erreicht. In Python stehen dafür Werkzeuge wie Multithreading und Multiprocessing zur Verfügung. Trotz der Global Interpreter Lock (GIL) kann Multithreading in Python Programme erheblich beschleunigen. Dies gilt besonders für I/O-intensive Aufgaben wie Netzwerkanfragen oder Dateioperationen.

In diesem Leitfaden erklären wir, wie Multithreading in Python funktioniert. Wir betrachten die threading-Bibliothek, vergleichen sie mit multiprocessing und zeigen praktische Beispiele. So verstehst du, wie du deinen Code optimieren und die Ausführungsgeschwindigkeit verbessern kannst.

Was ist Multithreading in Python?

Multithreading in Python ermöglicht es, mehrere Threads innerhalb eines Prozesses auszuführen. Jeder Thread führt einen Teil des Codes parallel aus. Dieser Ansatz ist effizient für Aufgaben, die auf externe Ressourcen warten.

Vorteile von Multithreading für I/O-Aufgaben

Multithreading beschleunigt Programme, wenn Aufgaben Folgendes umfassen:

  • Netzwerkanfragen, wie das Herunterladen von Daten aus dem Internet.
  • Dateioperationen, einschließlich Lesen und Schreiben.
  • Datenbankzugriffe.
  • Andere I/O-Operationen, bei denen die CPU im Leerlauf wartet.

Allerdings hat Multithreading Einschränkungen. In Python gibt es die Global Interpreter Lock (GIL). Die GIL verhindert die gleichzeitige Ausführung von Python-Bytecode in mehreren Threads. Daher ist Multithreading nicht für rechenintensive Aufgaben geeignet, die eine volle CPU-Auslastung erfordern.

Wann Multithreading oder Multiprocessing verwenden?

Die Wahl zwischen Multithreading und Multiprocessing hängt von der Art der Aufgaben ab. Multithreading eignet sich für wartende Szenarien, Multiprocessing für Berechnungen.

Empfehlungen nach Szenario

  • I/O-intensive Aufgaben: Verwende threading (Threads), um den Hauptthread nicht zu blockieren.
  • Rechenintensive Aufgaben: Nutze multiprocessing (Prozesse), um die GIL zu umgehen und mehrere CPU-Kerne zu nutzen.
  • Arbeit mit Netzwerk-APIs: Wähle threading für effiziente Anfrageverarbeitung.
  • Parallele Datenverarbeitung: Verwende multiprocessing, um die Last auf mehrere Prozessoren zu verteilen.

Dieser Ansatz hilft, ineffiziente Ressourcennutzung zu vermeiden und die Programmausführung zu beschleunigen.

Die threading-Bibliothek: Grundlagen und Beispiele

Die threading-Bibliothek in Python bietet Werkzeuge zum Erstellen und Verwalten von Threads. Sie ist einfach zu bedienen und ideal für Einsteiger.

Einfaches Beispiel zur Thread-Erstellung

Hier ist ein grundlegendes Beispiel für Multithreading in Python:

import threading
import time

def print_numbers():
    for i in range(5):
        print(f"Zahl: {i}")
        time.sleep(1)

# Thread erstellen
thread = threading.Thread(target=print_numbers)
thread.start()

# Hauptthread läuft weiter
print("Hauptthread beendet!")

In diesem Code endet der Hauptthread sofort, während die Funktion print_numbers in einem separaten Thread ausgeführt wird. Dies zeigt, wie Multithreading die Arbeit ohne Wartezeit fortsetzen kann.

Argumente an einen Thread übergeben

Um Daten an die Thread-Funktion zu übergeben, verwende den Parameter args:

def greet(name):
    print(f"Hallo, {name}!")

thread = threading.Thread(target=greet, args=("Max",))
thread.start()

Hier wird das Argument "Max" an die Funktion greet übergeben. Dies ist nützlich, um Aufgaben in Threads zu parametrisieren.

Auf Thread-Abschluss warten mit join

Die Methode join ermöglicht es, auf das Ende eines Threads zu warten. So stellst du sicher, dass alle Aufgaben abgeschlossen sind, bevor das Programm fortfährt.

Blogs

Buchempfehlungen