Threading reduziert die Ausführungszeit eines Programms erheblich. Erfahren Sie, wie Sie Threading in Python implementieren.
Die Ausführungszeit ist eines der üblichen Maße für die Effizienz eines Programms. Je schneller die Ausführungszeit, desto besser das Programm. Threading ist eine Technik, die es einem Programm ermöglicht, mehrere Aufgaben oder Prozesse gleichzeitig auszuführen.
Sie lernen, wie Sie das integrierte Python verwenden Einfädeln Modul und die gleichzeitige.Funktionen Modul. Beide Module bieten einfache Möglichkeiten zum Erstellen und Verwalten von Threads
Bedeutung des Threadings
Threading reduziert die Zeit, die ein Programm benötigt, um einen Job abzuschließen. Wenn der Job mehrere unabhängige Tasks enthält, können Sie Threading verwenden, um die Tasks gleichzeitig auszuführen, wodurch die Wartezeit des Programms für den Abschluss einer Task verkürzt wird, bevor mit der nächsten fortgefahren wird.
Beispielsweise ein Programm, das mehrere Bilddateien aus dem Internet herunterlädt. Dieses Programm kann Threading verwenden, um die Dateien parallel statt einzeln herunterzuladen. Dadurch entfällt die Zeit, die das Programm auf den Abschluss des Download-Vorgangs einer Datei warten müsste, bevor es mit der nächsten fortfährt.
Anfangsprogramm vor dem Einfädeln
Die Funktion im folgenden Programm repräsentiert eine Aufgabe. Die Aufgabe besteht darin, die Ausführung des Programms für eine Sekunde anzuhalten. Das Programm ruft die Funktion zweimal auf, wodurch zwei Tasks erstellt werden. Es berechnet dann die Zeit, die für die Ausführung des gesamten Programms benötigt wurde, und zeigt sie dann auf dem Bildschirm an.
importieren Zeit
start_time = time.perf_counter()
defPause():
drucken('Schlaf 1 Sekunde...')
time.sleep(1)
drucken('Schlaf fertig...')
Pause()
Pause()
finish_time = time.perf_counter()
drucken(f'Fertig in {Runde (Zielzeit - Startzeit, 2)} zweite(n)')
Die Ausgabe zeigt, dass die Ausführung des Programms 2,01 Sekunden gedauert hat. Jede Aufgabe dauerte eine Sekunde und der Rest des Codes dauerte 0,01 Sekunden, um ausgeführt zu werden.
Sie können Threading verwenden, um beide Aufgaben gleichzeitig auszuführen. Dies dauert für die Ausführung beider Aufgaben eine Sekunde.
Implementieren von Threading mit dem Threading-Modul
Um den ursprünglichen Code zum Implementieren von Threading zu ändern, importieren Sie die Einfädeln Modul. Zwei Threads erstellen, Thread_1 Und Faden_2 Verwendung der Gewinde Klasse. Ruf den Start -Methode für jeden Thread, um seine Ausführung zu starten. Ruf den verbinden -Methode in jedem Thread, um auf deren Ausführung zu warten, bevor der Rest des Programms ausgeführt wird.
importieren Zeit
importieren Einfädeln
start_time = time.perf_counter()defPause():
drucken('Schlaf 1 Sekunde...')
time.sleep(1)
drucken('Schlaf fertig...')Thread_1 = Einfädeln. Thread (Ziel=Pause)
thread_2 = Threading. Thread (Ziel=Pause)thread_1.start()
thread_2.start()thread_1.join()
thread_2.join()
finish_time = time.perf_counter()
drucken(f'Fertig in {Runde (Zielzeit - Startzeit, 2)} zweite(n)')
Das Programm führt beide Threads gleichzeitig aus. Dadurch wird die Zeit reduziert, die zum Ausführen beider Aufgaben benötigt wird.
Die Ausgabe zeigt, dass die Zeit, die zum Ausführen derselben Aufgaben benötigt wird, etwa eine Sekunde beträgt. Dies ist die Hälfte der Zeit, die das ursprüngliche Programm benötigte.
Implementieren von Threading mit dem concurrent.futures-Modul
Python 3.2 sah die Einführung des concurrent.futures Modul. Dieses Modul bietet eine High-Level-Schnittstelle zum Ausführen asynchroner Aufgaben mithilfe von Threads. Es bietet eine einfachere Möglichkeit, Aufgaben parallel auszuführen.
Um das ursprüngliche Programm für die Verwendung von Threading zu ändern, importieren Sie das Modul concurrent.features. Verwenden Sie die ThreadPoolExecutor -Klasse aus dem concurrent.futures-Modul, um einen Pool von Threads zu erstellen. Den... einreichen Pause Funktion zum Pool zweimal. Der einreichen Methode gibt a zurück Zukunft Objekt, das das Ergebnis des Funktionsaufrufs darstellt.
Iteriere über die Zukünfte und drucken Sie ihre Ergebnisse mit der Ergebnis Methode.
importieren Zeit
importieren concurrent.futuresstart_time = time.perf_counter()
defPause():
drucken('Schlaf 1 Sekunde...')
time.sleep(1)
zurückkehren'Schlaf fertig...'mit concurrent.futures. ThreadPoolExecutor() als Testamentsvollstrecker:
Ergebnisse = [executor.submit (Pause) für _ In Bereich(2)]
für F In concurrent.futures.as_completed (Ergebnisse):
drucken (f.result())finish_time = time.perf_counter()
drucken(f'Fertig in {Runde (Zielzeit - Startzeit, 2)} zweite(n)')
Das Modul concurrent.features übernimmt für Sie das Starten und Verbinden der Threads. Dadurch wird Ihr Code sauberer.
Die Ausgabe ist identisch mit der des Threading-Moduls. Das Threading-Modul ist nützlich für einfache Fälle, in denen Sie einige Threads parallel ausführen müssen. Andererseits ist das Modul concurrent.futures nützlich für komplexere Fälle, in denen Sie viele Aufgaben gleichzeitig ausführen müssen.
Verwenden von Threading in einem realen Szenario
Die Verwendung von Threads zum Ausführen des obigen Programms reduzierte die Zeit um eine Sekunde. In der realen Welt sparen Threads mehr Zeit. Erstellen Sie ein Programm, das Bilder aus dem Internet herunterlädt. Beginnen Sie mit Erstellen einer neuen virtuellen Umgebung. Führen Sie den folgenden Befehl im Terminal aus, um die Anfragen Bibliothek:
Pip-Installationsanfragen
Die Anforderungsbibliothek ermöglicht es Ihnen, HTTP-Anforderungen zu senden. Importieren Sie die Anforderungsbibliothek und die Zeitbibliothek.
importieren Anfragen
importieren Zeit
Erstellen Sie eine Liste mit URLs der Bilder, die Sie herunterladen möchten. Lassen Sie sie mindestens zehn sein, damit Sie einen signifikanten Unterschied feststellen können, wenn Sie Threading implementieren.
img_urls = [
' https://images.unsplash.com/photo-1524429656589-6633a470097c',
' https://images.unsplash.com/photo-1530224264768-7ff8c1789d79',
' https://images.unsplash.com/photo-1564135624576-c5c88640f235',
' https://images.unsplash.com/photo-1541698444083-023c97d3f4b6',
' https://images.unsplash.com/photo-1522364723953-452d3431c267',
' https://images.unsplash.com/photo-1513938709626-033611b8cc03',
' https://images.unsplash.com/photo-1507143550189-fed454f93097',
' https://images.unsplash.com/photo-1493976040374-85c8e12f0c0e',
' https://images.unsplash.com/photo-1504198453319-5ce911bafcde',
' https://images.unsplash.com/photo-1530122037265-a5f1f91d3b99',
' https://images.unsplash.com/photo-1516972810927-80185027ca84',
' https://images.unsplash.com/photo-1550439062-609e1531270e',
]
Schleife über die Liste von URLs, die jedes Bild in denselben Ordner herunterladen, der Ihr Projekt enthält. Zeigen Sie die zum Herunterladen der Bilder benötigte Zeit an, indem Sie die Endzeit von der Startzeit subtrahieren.
start_time = time.perf_counter()
für img_url In img_urls:
img_bytes = Anfragen.get (img_url).Inhalt
img_name = img_url.split('/')[3]
img_name = F'{img_name}.jpg'
mit öffnen (img_name, 'wb') als img_file:
img_file.write (img_bytes)
drucken(F'{img_name} wurde heruntergeladen...')
finish_time = time.perf_counter()
drucken(f'Fertig in {finish_time - start_time} Sekunden)
Das Programm benötigt etwa 22 Sekunden, um die 12 Bilder herunterzuladen. Es kann für Sie variieren, da die Zeit, die zum Herunterladen der Bilder benötigt wird, auch von der Geschwindigkeit Ihres Internets abhängt.
Ändern Sie das Programm so, dass es Threading mit dem concurrent.features-Modul verwendet. Verwenden Sie anstelle einer Schleife eine Funktion. Dies ist die Funktion, an die Sie übergeben werden Testamentsvollstrecker Beispiel.
importieren Anfragen
importieren Zeit
importieren concurrent.futuresimg_urls = [
' https://images.unsplash.com/photo-1524429656589-6633a470097c',
' https://images.unsplash.com/photo-1530224264768-7ff8c1789d79',
' https://images.unsplash.com/photo-1564135624576-c5c88640f235',
' https://images.unsplash.com/photo-1541698444083-023c97d3f4b6',
' https://images.unsplash.com/photo-1522364723953-452d3431c267',
' https://images.unsplash.com/photo-1513938709626-033611b8cc03',
' https://images.unsplash.com/photo-1507143550189-fed454f93097',
' https://images.unsplash.com/photo-1493976040374-85c8e12f0c0e',
' https://images.unsplash.com/photo-1504198453319-5ce911bafcde',
' https://images.unsplash.com/photo-1530122037265-a5f1f91d3b99',
' https://images.unsplash.com/photo-1516972810927-80185027ca84',
' https://images.unsplash.com/photo-1550439062-609e1531270e',
]start_time = time.perf_counter()
defBild herunterladen(img_url):
img_bytes = Anfragen.get (img_url).Inhalt
img_name = img_url.split('/')[3]
img_name = F'{img_name}.jpg'
mit öffnen (img_name, 'wb') als img_file:
img_file.write (img_bytes)
drucken(F'{img_name} wurde heruntergeladen...')mit concurrent.futures. ThreadPoolExecutor() als Testamentsvollstrecker:
executor.map (download_image, img_urls)finish_time = time.perf_counter()
drucken(f'Fertig in {finish_time-start_time} Sekunden)
Nach Einführung des Threadings. Die Zeit verkürzt sich erheblich. Es dauerte nur 4 Sekunden, um die Ausführung des Programms abzuschließen.
Für Threading geeignete Szenarien
Einige der für Threading geeigneten Szenarien sind:
- E/A-gebundene Aufgaben: Wenn das Programm die meiste Zeit damit verbringt, auf den Abschluss von Eingabe- oder Ausgabevorgängen zu warten. Threading kann die Leistung verbessern, indem andere Tasks ausgeführt werden können, während auf den Abschluss von E/A-Vorgängen gewartet wird.
- Web-Scraping: Beim Web Scraping werden HTTP-Anforderungen gestellt und HTML-Antworten geparst. Threading hilft, den Prozess zu beschleunigen, indem es Ihnen ermöglicht, mehrere Anfragen gleichzeitig zu stellen.
- CPU-gebundene Aufgaben: Threading kann helfen, die Leistung zu verbessern, indem mehrere Tasks parallel ausgeführt werden können.
Machen Sie sich mit dem Threading in anderen Sprachen vertraut
Python ist nicht die einzige Sprache, die Threading unterstützt. Die meisten Programmiersprachen unterstützen irgendeine Form von Threading. Es ist wichtig, sich mit der Implementierung von Threads in anderen Sprachen vertraut zu machen. Dies stattet Sie mit den notwendigen Fähigkeiten aus, um verschiedene Szenarien zu bewältigen, in denen Threading angewendet werden kann.