Python Multiprocessing: So steuerst du Prozesse zeitgleich und effizient
Nutze Python Multiprocessing, um die Arbeitslast auf mehrere Prozesse zu verteilen und so die Ausführungszeit deutlich zu verkürzen. Das zahlt sich besonders bei rechenintensiven Aufgaben oder großen Datenmengen aus.
Was ist Python Multiprocessing?
Multiprocessing in Python ermöglicht es dir, mehrere Prozesse simultan laufen zu lassen. Dadurch nutzt du die Power von Multi-Core-Systemen voll aus. Im Gegensatz zu Single-Thread-Verfahren, die Aufgaben nacheinander abarbeiten, laufen beim Multiprocessing verschiedene Programmteile parallel und autark ab. Jeder Prozess nutzt dabei seinen eigenen Speicher und eigene Prozessorkerne. Das reduziert die Wartezeit bei komplexen oder zeitkritischen Operationen massiv.
Die Einsatzgebiete für Python Multiprocessing sind extrem vielseitig. In der Datenanalyse hilft es dir, riesige Datensätze schneller zu bündeln und auszuwerten. Auch bei Simulationen und wissenschaftlichen Modellen verkürzt Multiprocessing die Rechenzeit spürbar. Zudem profitierst du beim Web-Scraping durch das gleichzeitige Abrufen verschiedener Quellen oder in der Bildverarbeitung (Computer Vision), wo komplexe Analysen so erst richtig effizient werden.
Welche Möglichkeiten für Python Multiprocessing gibt es?
Python bietet dir verschiedene Wege, Multiprocessing umzusetzen. Wir zeigen dir hier drei gängige Ansätze: das multiprocessing-Modul, die concurrent.futures-Bibliothek und das joblib-Paket.
Das multiprocessing-Modul
Das multiprocessing-Modul ist das Standardwerkzeug für Python Multiprocessing. Damit erstellst du Prozesse, tauscht Daten zwischen ihnen aus und synchronisierst sie mittels Sperren oder Warteschlangen.
import multiprocessing
def task(n):
result = n * n
print(f"Result: {result}")
if __name__ == "__main__":
processes = []
for i in range(1, 6):
process = multiprocessing.Process(target=task, args=(i,))
processes.append(process)
process.start()
for process in processes:
process.join()pythonIn diesem Beispiel nutzen wir die Klasse multiprocessing.Process, um Prozesse für die Funktion task() zu starten. Diese berechnet das Quadrat einer Zahl. Wir initiieren die Prozesse und warten auf deren Abschluss, bevor das Hauptprogramm weiterläuft. Die Ausgabe erfolgt via f-String, einer effizienten Python-String-Format-Methode. Beachte, dass die Reihenfolge der Ergebnisse hier zufällig ist.
Alternativ kannst du mit Python multiprocessing auch einen Prozesspool anlegen:
import multiprocessing
def task(n):
return n * n
if __name__ == "__main__":
with multiprocessing.Pool() as pool:
results = pool.map(task, range(1, 6))
print(results) # Output: [1, 4, 9, 16, 25]pythonÜber pool.map() wird die Funktion task() auf eine ganze Datensequenz angewendet, wobei die Ergebnisse gesammelt ausgegeben werden.
Die concurrent.futures-Bibliothek
Dieses Modul bietet dir eine komfortable High-Level-Schnittstelle für asynchrone und parallele Abläufe. Es nutzt den Pool-Executor, um Aufgaben auf Prozesse oder Threads zu verteilen. concurrent.futures ist oft intuitiver zu bedienen als das reine multiprocessing-Modul, wenn es um einfache asynchrone Tasks geht.
import concurrent.futures
def task(n):
return n * n
with concurrent.futures.ProcessPoolExecutor() as executor:
futures = [executor.submit(task, i) for i in range(1, 6)]
for future in concurrent.futures.as_completed(futures):
print(future.result()) # result in random orderpythonDer Code verwendet concurrent.futures-Modul, um Aufgaben mit dem ProcessPoolExecutor parallel zu erledigen. Hier wird die Funktion task(n) für die Zahlen 1 bis 5 aufgerufen. Die Methode as_completed() wartet, bis alles fertig ist, und liefert die Ergebnisse in beliebiger Abfolge zurück.
joblib
joblib ist eine externe Bibliothek, die Parallelisierung in Python vereinfacht – ideal für repetitive Aufgaben mit verschiedenen Parametern oder riesige Datenmengen. Die Stärken von joblib liegen in der einfachen Parallelisierung, dem Caching von Ergebnissen und der Schonung deiner Systemressourcen.
from joblib import Parallel, delayed
def task(n):
return n * n
results = Parallel(n_jobs=4)(delayed(task)(i) for i in range(1, 11))
print(results) # Output: Results of the function for numbers from 1 to 10pythonMit Parallel(n_jobs=4)(delayed(task)(i) for i in range(1, 11)) startest du die parallele Berechnung der Funktion task() für die Werte 1 bis 10. Durch die Konfiguration Parallel mit n_jobs=4 werden bis zu vier Jobs gleichzeitig abgearbeitet. Der Aufruf von delayed(task)(i) bereitet die parallelen Tasks für jede Zahl i vor. So läuft task() simultan für alle Werte ab, und das Endergebnis landet gesammelt in results.