Multithreading und Multiprocessing sind zwei Möglichkeiten, Multitasking in Python zu erreichen. Erfahren Sie den Unterschied zwischen ihnen, wann Sie sie verwenden und wie Sie sie implementieren.
Multithreading und Multiprocessing sind zwei Möglichkeiten, um Multitasking (denken Sie an verteiltes Rechnen) in Python zu erreichen . Multitasking ist nützlich, um Funktionen und Code gleichzeitig oder parallel auszuführen, z. B. um mathematische Berechnungen in mehrere kleinere Teile aufzuteilen oder Elemente in einer For-Schleife aufzuteilen , wenn sie voneinander unabhängig sind.
In diesem Artikel werden die Unterschiede zwischen Multithreading und Multiprocessing vorgestellt und verglichen. Außerdem wird erläutert, wann welche Methode verwendet wird und wie sie in Python implementiert werden.
Wir werden folgende Themen behandeln:
- Multithreading vs. Multiprocessing
- Multithreading als Python-Funktion
- Multithreading als Python-Klasse
- Multiprocessing als Python-Funktion
Multithreading vs. Multiprocessing
Unter Multithreading versteht man die Fähigkeit eines Prozessors, mehrere Threads gleichzeitig auszuführen, wobei jeder Thread einen Prozess ausführt.
Unter Multiprocessing versteht man die Fähigkeit eines Systems, mehrere Prozessoren parallel auszuführen , wobei jeder Prozessor einen oder mehrere Threads ausführen kann.
Aus dem obigen Diagramm können wir erkennen, dass beim Multithreading (mittleres Diagramm) mehrere Threads denselben Code, dieselben Daten und Dateien gemeinsam nutzen, aber auf einem anderen Register und Stapel ausgeführt werden. Beim Multiprocessing (rechtes Diagramm) wird ein einzelner Prozessor vervielfacht und Code, Daten und Dateien repliziert, was zu einem höheren Overhead führt.
Vorteile und Nachteile von Multithreading und Multiprocessing
Multithreading ist für IO-gebundene Prozesse nützlich, wie das Lesen von Dateien aus einem Netzwerk oder einer Datenbank, da jeder Thread den IO-gebundenen Prozess gleichzeitig ausführen kann. Multiprocessing ist für CPU-gebundene Prozesse nützlich, wie rechenintensive Aufgaben, da es von mehreren Prozessoren profitiert; ähnlich wie Multicore-Computer schneller arbeiten als Computer mit nur einem Kern.
Es besteht ein Unterschied zwischen Gleichzeitigkeit und Parallelität . Bei der Parallelität können mehrere Aufgaben gleichzeitig ausgeführt werden, während bei der Gleichzeitigkeit mehrere Aufgaben nacheinander und in verschachtelter Weise ausgeführt werden können.
Aufgrund der globalen Interpretersperre (GIL) von Python kann immer nur ein Thread gleichzeitig ausgeführt werden. Daher erreicht Multithreading nur Gleichzeitigkeit und keine Parallelität für IO-gebundene Prozesse. Andererseits erreicht Multiprocessing Parallelität.
Die Verwendung von Multithreading für CPU-gebundene Prozesse kann die Leistung beeinträchtigen, da konkurrierende Ressourcen dafür sorgen, dass immer nur ein Thread ausgeführt werden kann und bei der Verarbeitung mehrerer Threads ein Overhead entsteht.
Andererseits kann Multiprocessing für IO-gebundene Prozesse verwendet werden. Allerdings ist der Overhead bei der Verwaltung mehrerer Prozesse höher als bei der Verwaltung mehrerer Threads, wie oben dargestellt. Möglicherweise stellen Sie fest, dass Multiprocessing zu einer höheren CPU-Auslastung führen kann, da das Programm mehrere CPU-Kerne verwendet, was zu erwarten ist.
Multithreading als Python-Funktion
Multithreading kann mithilfe der in Python integrierten Bibliothek „ Threading “ implementiert werden und erfolgt in der folgenden Reihenfolge:
- Thread erstellen: Jeder Thread wird mit seinen Argumenten einer Python- Funktion zugeordnet .
- Starten Sie die Aufgabenausführung.
- Warten Sie, bis der Thread die Ausführung abgeschlossen hat: Nützlich, um die Fertigstellung oder „Checkpoints“ sicherzustellen.
Im folgenden Codeausschnitt werden die oben genannten Schritte zusammen mit einer Threadsperre (Zeile 22) zur Handhabung konkurrierender Ressourcen implementiert, die in unserem Fall optional ist.
Es gibt einige bemerkenswerte Beobachtungen:
- Zeile 12–15: Prozesse werden auf unterschiedlichen Threads (Thread-ID), aber mit demselben Prozessor (Prozess-ID) ausgeführt.
- Zeile 8: Wenn time.sleep(sleep_duration)stattdessen zwischen dem Erwerb und der Freigabe der Sperre eine Implementierung durchgeführt würde, würden die Threads nacheinander ausgeführt und es ergäbe sich keine Zeitersparnis.
Multithreading als Python-Klasse
Für Benutzer, die objektorientierte Programmierung bevorzugen, kann Multithreading als Python-Klasse implementiert werden , die von der Superklasse erbt threading.Thread. Ein Vorteil der Verwendung von Klassen anstelle von Funktionen wäre die Möglichkeit, Variablen über Klassenobjekte gemeinsam zu nutzen.
Der Unterschied zwischen der Implementierung von Multithreading als Funktion und nicht als Klasse besteht im ersten Schritt, dem Erstellen eines Threads, da ein Thread nun einer Klassenmethode und nicht einer Funktion zugeordnet ist. Die nachfolgenden Schritte zum Aufrufen t1.start()und t1.join()bleiben gleich.
Multiprocessing als Python-Funktion
Multiprocessing kann mit der integrierten Python-Bibliothek mithilfe von zwei verschiedenen Methoden implementiert werden: Prozess und Pool. multiprocessing
Die Prozessmethode ähnelt der Multithreading-Methode oben, bei der jeder Prozess mit seinen Argumenten einer Funktion zugeordnet ist. Im folgenden Codeausschnitt können wir sehen, dass Multiprocessing länger dauert als Multithreading, da der Overhead beim Ausführen mehrerer Prozessoren höher ist numpy array.
Mit der Pool- Methode können Benutzer die Anzahl der Worker definieren und alle Prozesse nach dem First-In-First-Out-Prinzip auf die verfügbaren Prozessoren verteilen. Die Prozessplanung erfolgt dabei automatisch. Die Pool-Methode wird verwendet, um eine Funktion mithilfe von „ mapoder“ starmap(Zeile 19) in mehrere kleine Teile aufzuteilen und dieselbe Funktion mit unterschiedlichen Eingabeargumenten auszuführen. Die Prozess-Methode hingegen wird verwendet, um unterschiedliche Funktionen auszuführen.
Bei den Python-Beispielen handelt es sich um Codefragmente im Skelettstil, die Sie durch Ihre Funktionen ersetzen können, und schon kann es losgehen.