1. Einleitung
Python ist eine vielseitig einsetzbare Programmiersprache, die besonders in den Bereichen Datenverarbeitung, Machine Learning und Webentwicklung leistungsstarke Werkzeuge bietet. Unter diesen ist das multiprocessing-Modul eine wichtige Bibliothek zur Umsetzung von Parallelverarbeitung. In diesem Artikel erklären wir die Grundlagen und fortgeschrittene Nutzung des multiprocessing-Moduls in Python, ergänzt durch visuelle Beispiele, und stellen praxisnahe Techniken vor, um die Leistung maximal auszuschöpfen.
2. Was ist multiprocessing?
2.1 Die Notwendigkeit von Parallelverarbeitung
Python läuft standardmäßig im Single-Thread-Modus. Bei rechenintensiven Aufgaben oder großen Datenmengen stößt dieses Vorgehen jedoch an Geschwindigkeitsgrenzen. Mit Parallelverarbeitung können mehrere Aufgaben gleichzeitig ausgeführt werden, wodurch alle CPU-Kerne genutzt und die Bearbeitungszeit verkürzt werden kann. Das multiprocessing-Modul umgeht das Python-GIL (Global Interpreter Lock) und ermöglicht durch die Nutzung mehrerer Prozesse echte Parallelität.
2.2 Unterschied zum Single-Thread
Im Single-Thread-Modus führt ein Prozess die Aufgaben nacheinander aus. Mit Multiprocessing hingegen bearbeiten mehrere Prozesse die Aufgaben parallel. Dies verbessert insbesondere die Leistung bei CPU-intensiven Aufgaben wie numerischen Berechnungen oder Datenanalysen.
3. Grundsyntax des multiprocessing-Moduls
3.1 Verwendung der Process-Klasse
Das Herzstück des multiprocessing
-Moduls ist die Process-Klasse. Mit ihr lassen sich neue Prozesse erstellen und Parallelverarbeitung einfach umsetzen.
import multiprocessing
def worker_function():
print("Ein neuer Prozess wurde gestartet")
if __name__ == "__main__":
process = multiprocessing.Process(target=worker_function)
process.start()
process.join()
Dieser Code startet die worker_function
in einem neuen Prozess. Mit start()
wird der Prozess gestartet und mit join()
wartet das Hauptprogramm auf dessen Abschluss.
3.2 Übergabe von Argumenten an Prozesse
Um Argumente an einen Prozess zu übergeben, verwendet man den args
-Parameter. Im folgenden Beispiel erhält die worker
-Funktion ein Argument:
def worker(number):
print(f'Arbeiter {number} wurde gestartet')
if __name__ == "__main__":
process = multiprocessing.Process(target=worker, args=(5,))
process.start()
process.join()
So lassen sich dynamische Daten an Prozesse übergeben und parallel verarbeiten.
4. Datenaustausch und Synchronisation
4.1 Gemeinsamer Speicher
Im Multiprocessing können Daten mit Value und Array sicher zwischen Prozessen geteilt werden. Diese Objekte ermöglichen es, dass mehrere Prozesse gleichzeitig darauf zugreifen können, ohne Datenkorruption zu verursachen.
import multiprocessing
def increment_value(shared_value):
with shared_value.get_lock():
shared_value.value += 1
if __name__ == "__main__":
shared_value = multiprocessing.Value('i', 0)
processes = [multiprocessing.Process(target=increment_value, args=(shared_value,)) for _ in range(5)]
for process in processes:
process.start()
for process in processes:
process.join()
print(f'Endwert: {shared_value.value}')
In diesem Beispiel inkrementieren fünf Prozesse gleichzeitig denselben Wert im gemeinsamen Speicher. Mit get_lock()
werden Datenkonflikte vermieden.
4.2 Verwendung von Locks
Um Datenkonflikte bei gleichzeitigen Zugriffen zu verhindern, wird die Sperrmechanik (Lock) eingesetzt. Mit Lock
-Objekten wird die Synchronisation zwischen Prozessen gewährleistet.

5. Aufgabenverteilung mit einem Prozesspool
5.1 Nutzung der Pool-Klasse
Die Pool
-Klasse erlaubt es, Aufgaben auf mehrere Prozesse aufzuteilen und parallel auszuführen – besonders nützlich bei großen Datenmengen.
from multiprocessing import Pool
def square(x):
return x * x
if __name__ == "__main__":
with Pool(4) as pool:
results = pool.map(square, range(10))
print(results)
Hier wird die Quadratberechnung einer Liste auf vier Prozesse verteilt. Mit map()
erfolgt die Verteilung einfach und effizient.
Diagramm: Aufgabenverteilung mit Pool

5.2 Beispiel mit starmap für mehrere Argumente
Mit starmap()
lassen sich Funktionen mit mehreren Argumenten parallel ausführen:
def multiply(x, y):
return x * y
if __name__ == "__main__":
with Pool(4) as pool:
results = pool.starmap(multiply, [(1, 2), (3, 4), (5, 6), (7, 8)])
print(results)
6. Optimale Nutzung der CPU-Ressourcen
6.1 Prozessanzahl mit cpu_count()
optimieren
Mit multiprocessing.cpu_count()
lässt sich die Anzahl der CPU-Kerne ermitteln und die Prozessanzahl daran anpassen. So wird eine Überlastung des Systems vermieden.
from multiprocessing import Pool, cpu_count
if __name__ == "__main__":
with Pool(cpu_count() - 1) as pool:
results = pool.map(square, range(100))
print(results)
6.2 Effiziente Ressourcennutzung
Es ist ratsam, einen CPU-Kern für das System freizuhalten, um andere Aufgaben nicht zu beeinträchtigen.
7. Praxisbeispiele und Best Practices
7.1 Konkrete Anwendungsfälle
Multiprocessing ist besonders nützlich in folgenden Szenarien:
- Große Datenverarbeitung: Gleichzeitiges Einlesen und Verarbeiten mehrerer Dateien.
- Paralleles Training im Machine Learning: Modelle können in mehreren Prozessen trainiert werden, um Zeit zu sparen.
- Web Crawling: Gleichzeitiges Abrufen mehrerer Webseiten zur effizienten Datensammlung.
7.2 Best Practices
- Optimale Ressourcenzuweisung: Prozessanzahl auf die Anzahl der CPU-Kerne abstimmen.
- Debugging und Logging: Mit dem
logging
-Modul die Prozesse überwachen und Fehlerbehandlung implementieren.
import logging
import multiprocessing
def worker_function():
logging.info(f'Prozess {multiprocessing.current_process().name} wurde gestartet')
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
process = multiprocessing.Process(target=worker_function, name='Worker1')
process.start()
process.join()
Mit logging
lassen sich Prozessaktivitäten aufzeichnen und später analysieren.
- Fehlerbehandlung: Da mehrere Prozesse gleichzeitig laufen, ist robuste Fehlerbehandlung mit try-except besonders wichtig, um Stabilität zu gewährleisten.

8. Fazit
In diesem Artikel haben wir gezeigt, wie sich mit dem Python-multiprocessing-Modul effiziente Parallelverarbeitung umsetzen lässt – von der Nutzung der Process-Klasse, über gemeinsame Speicher- und Pool-Konzepte, bis hin zu praxisnahen Anwendungen.
Durch korrekt eingesetzte Parallelverarbeitung können Projekte wie Datenanalyse, Machine Learning oder Web Crawling erheblich beschleunigt werden. Das multiprocessing-Modul ist damit ein leistungsstarkes Werkzeug, um Systemressourcen optimal auszunutzen und die Leistungsfähigkeit von Python deutlich zu steigern.
Nutzen Sie die hier vorgestellten Techniken, um multiprocessing gezielt in Ihre Entwicklungsprojekte einzubauen.