Wenn Sie gerade erst in Python anfangen und mehr erfahren möchten, nehmen Sie an Datacamps Einführung in Data Science in Python Kurs.

Einführung

Durch Threading können verschiedene Teile Ihres Prozesses gleichzeitig ausgeführt werden (Quelle: RealPython). Diese verschiedenen Teile sind normalerweise individuell und haben eine separate Ausführungseinheit, die zum selben Prozess gehört., Der Prozess ist nichts anderes als ein laufendes Programm, das einzelne Einheiten hat, die gleichzeitig ausgeführt werden können. Zum Beispiel könnte ein Webbrowser ein Prozess sein, eine Anwendung, die mehrere Kameras gleichzeitig ausführt, könnte ein Prozess sein; Ein Videospiel ist ein weiteres Beispiel für einen Prozess.

Innerhalb eines Prozesses kommt das Konzept des mehrfachen Threading oder allgemein bekannt als Multi-Threading, wo mehrere Threads zusammenarbeiten, um ein gemeinsames Ziel zu erreichen. Der wichtigste Vorteil der Verwendung von Threads besteht darin, dass Sie das Programm parallel ausführen können.,

Lassen Sie uns das Konzept des Einfädelns anhand eines Beispiels verstehen. Stellen Sie sich vor, Sie haben eine Anwendung, die die Anzahl der Autos zählt, die den Parkplatz des Einkaufszentrums betreten und verlassen. Ihr Gerät verfügt über verschiedene Kameras, die den Ein-und Ausgang überwachen, der an ein zentrales Gerät angeschlossen ist. Jede Kamera verfügt über einen Algorithmus zur Überwachung des Fahrzeugflusses, der zum selben Prozess oder Programm gehört. Jede Kamera könnte jedoch zusammen mit dem Algorithmus, auf dem sie ausgeführt wird, Teil eines separaten Threads sein., Nicht nur das, auch die von der Kamera gelesenen Frames und der Algorithmus, der die Frames vorhersagt, könnten zwei separate Threads sein.

Ein weiteres Beispiel könnte ein Videospiel sein, bei dem der Prozess die Aufgaben wie Grafik, Benutzerinteraktion und Netzwerk (während des Spielens von Multiplayer-Spielen) parallel ausführen muss, da er jederzeit reagieren muss. Um dies zu erreichen, muss das Konzept des Multithreading verwendet werden, bei dem jeder Thread für die Ausführung jeder unabhängigen und individuellen Aufgabe verantwortlich ist.,

Ein Thread hat seinen Ausführungsfluss, was bedeutet, dass im Prozess mehrere Dinge gleichzeitig passieren.

Es ist wichtig zu beachten, dass jeder Prozess mindestens einen Thread hat und als main threadbezeichnet wird. Wenn Ihr Programm keinen definierten Thread hat, hat es zumindest den Hauptthread, dh den Prozess selbst.

Wenn Sie sich das obige Diagramm ansehen, gibt es einen Prozess, der aus dem Hauptthread besteht, der aus globalen Variablen und drei verschiedenen Threads t1, t2 und t3 besteht. Jeder Thread hat seine lokalen Variablen und den Ablauf der Codeausführung., Die Threads teilen sich im Allgemeinen die Ressourcen des Prozesses, wie die Ressourcen, die dem Hauptthread zur Verfügung stehen, auch zwischen den drei Threads t1, t2 und t3 gemeinsam genutzt werden. Alle Threads haben Zugriff auf die globalen Variablen, während sie ihre eigenen lokalen Variablen haben.,

Es gibt verschiedene Arten von Threads:

  • Kernel thread
  • User Thread
  • Kombination von Kernel und User Thread

Nun schauen wir uns einige der Vorteile des Threading in Ihrem Programm an:

  • Multi-Threading ermöglicht es dem Programm, die Ausführung zu beschleunigen, vorausgesetzt, es verfügt über mehrere CPUs.

  • Damit können Sie auch andere Aufgaben ausführen, während die E / A-Vorgänge mit Hilfe mehrerer Threads oder sogar eines Hauptthreads zusammen mit einem einzelnen Thread ausgeführt werden., Beispielsweise wird die Geschwindigkeit, mit der die Frames von der Kamera gelesen und durch den Algorithmus abgeleitet werden, von verschiedenen Threads verarbeitet. Daher muss der Algorithmus nicht warten, bis der Frame eingegeben wird, und der Frame-Leseteil muss nicht warten, bis die Algorithmusausführung abgeschlossen ist, um den nächsten Frame lesen zu können.

  • Threads innerhalb desselben Prozesses können den Speicher und die Ressourcen des Hauptthreads gemeinsam nutzen.,

Herausforderungen beim Threading:

  • Denken Sie daran, dass Python auf der CPython-Implementierung basiert, die nur einen Thread begrenzt, der gleichzeitig ausgeführt werden soll; Threading beschleunigt möglicherweise nicht alle Aufgaben. Und der wesentliche Grund dafür ist Global Interpreter Lock (GIL).

    Wenn Sie mehr über GIL erfahren möchten, dann schauen Sie sich dieses Tutorial an.

  • Wenn Sie die CPU-intensive Aufgabe beschleunigen möchten, ist Threading möglicherweise nicht die beste Lösung für Sie. In solchen Fällen wird die Mehrfachverarbeitung als nützlich angesehen.,

  • Um ein Programm auszuführen, das aus verschiedenen Threads besteht, muss es schnell über Threads hinweg wechseln; Daher muss die Planung in Programmen erledigt werden, in denen Sie viele Threads haben.

  • Ressourcenfreigabe kann auch ein Problem sein, da alle Threads die gleichen Ressourcen und den gleichen Speicher der globalen Variablen haben. Daher können Operationen, die in einem Thread ausgeführt werden, einen Speicherfehler für einen anderen Thread verursachen, oder der andere Thread kann den Speicher möglicherweise nicht dazu bringen, seine Aufgabe auszuführen.,

Threading in Python

  • In Python ist das Threading-Modul ein integriertes Modul, das als threading bekannt ist und direkt importiert werden kann.

  • Da in Python fast alles als Objekt dargestellt wird, ist Threading auch in Python ein Objekt. Ein Thread ist in der Lage

    • Daten zu halten,
    • In Datenstrukturen wie Wörterbüchern, Listen, Sätzen usw. gespeichert.
    • Kann als Parameter an eine Funktion übergeben werden.
  • Ein Thread kann auch als Prozess ausgeführt werden.,

  • Ein Thread in Python kann verschiedene Zustände haben wie:

    • Wait,
    • Locked.

Lassen Sie uns nun lernen, wie Sie Threading in Python implementieren können.

Thread-Modul in Python3

Beachten Sie, dass Python3 abwärtskompatibel mit dem – Modul ist, das in Python2.7 vorhanden ist. In Python3 kann es als _thread Modul importiert werden. Nehmen wir also ein Beispiel und verstehen Sie das Modul _thread.,

import _thread #thread module importedimport time #time module

Definieren wir eine Funktion namens thread_delay, die zwei Parameter als Eingabe verwendet, dh den Namen des Threads und die Verzögerung. Innerhalb dieser Funktion werden Sie:

  • Definieren Sie einen Zähler mit Null,
  • Dann werden Sie mit einer while-Schleife herumlaufen, die dreimal ausgeführt wird,
  • Innerhalb der while-Schleife werden Sie time.sleep() um Verzögerung hinzuzufügen, wird diese Verzögerung nützlich sein, um die Ausführung des Threads zu verstehen., Diese Verzögerung wird in Sekunden sein,
  • Dann erhöhen Sie Ihren Zähler um 1,
  • Um zu sehen, ob Ihre Thread-Ausführung reibungslos verläuft, drucken Sie den Namen des Threads und den Zeitpunkt, zu dem der Thread ausgeführt wird.
def thread_delay(thread_name, delay): count = 0 while count < 3: time.sleep(delay) count += 1 print(thread_name, '-------->', time.time())

Um nun die Thread-Funktionalität der obigen Funktion hinzuzufügen oder die obige Funktion im Thread auszuführen, verwenden Sie die start_new_thread – Methode, die sich in der _thread module.

Sehen wir uns den docstring derstart_new_thread – Methode an.,

?_thread.start_new_thread

Lassen Sie uns die Funktion thread_delay ohne Klammern und die beiden Argumente übergeben, dh Thread-Name und die Verzögerung (um die Thread-Ausführung zu visualisieren, da sie sehr schnell).

_thread.start_new_thread(thread_delay, ('t1', 1))_thread.start_new_thread(thread_delay, ('t2', 3))

Aus der obigen Ausgabe können Sie sehen, dass der Thread t1 zuerst ausgeführt wird., Inzwischen wartet thread t2, da es eine Verzögerung von 3 Sekunden gibt, und sobald diese Verzögerung beendet ist, wird Thread t2 ausgeführt, und auch die Verzögerung für thread t1 ist nur 1 Sekunde.

Ändern wir nun die Verzögerung von t2 in 5 Sekunden, die t2 nach t1 hätte die Ausführung beendet, da t1 nur 3 Sekunden benötigt, um die Ausführung abzuschließen.,

_thread.start_new_thread(thread_delay, ('t1', 1))_thread.start_new_thread(thread_delay, ('t2', 5))

Threading mit dem Threading-Modul implementieren

Verwenden wir dasselbe Beispiel wie oben, aber dieses Mal verwenden Sie das threading – Modul anstelle des _thread – Moduls.

import threadingimport time
def thread_delay(thread_name, delay): count = 0 while count < 3: time.sleep(delay) count += 1 print(thread_name, '-------->', time.time())

Innerhalb der threading – Klasse befindet sich eine Thread – Klasse, die der start_new_thread – Funktion der _thread – Modul ähnelt.,

Schauen wir uns den docstring der Thread – Klasse an, der mehrere Parameter wie group, target (wie eine Funktion), args usw. aufnimmt.

?threading.Thread

Im Thread-Klassenkonstruktor übergeben Sie die Zielfunktion thread_delay und die Argumente dieser Funktion.,

t1 = threading.Thread(target=thread_delay, args=('t1', 1))t2 = threading.Thread(target=thread_delay, args=('t2', 3))

Um den Thread auszuführen oder auszuführen, verwenden Sie im Threading-Modul die Methode start(), die für die Ausführung des Threads verantwortlich ist.

?t1.start
t1.start()t2.start()

Sie werden auch die join methode, die bedeutet, dass warten, bis alle der thread die Ausführung ist abgeschlossen., Welcher Code auch immer Sie nach der join – Methode geschrieben haben, wird nur ausgeführt, sobald diese Threads beendet wurden.

?t1.join
t1.start()t2.start()t1.join()t2.join()print("Thread execution is complete!")

Nun berechnen wir das Volumen von Würfel und Quadrat, mit dem threading-Konzept, das ist ziemlich straight-forward.

def volume_cube(a): print ("Volume of Cube:", a*a*a)
def volume_square(a): print ("Volume of Square:", a*a)
t1 = threading.Thread(target=volume_cube, args=(2))t2 = threading.Thread(target=volume_square, args=(3))
t1.start()t2.start()t1.join()t2.join()print("Thread execution is complete!")

Warten; was? Sobald Sie die Start-Methode ausgeführt haben, führte dies zu einem Fehler., Das liegt daran, dass der Parameter args ein Tupel erwartet, und da die volume_cube und volume_square nur einen Parameter erwarten, müssen Sie daher ein Komma in den Parameter args setzen, nachdem Sie das erste Argument der Funktionen angegeben haben.

t1.start()t2.start()t1.join()t2.join()print("Thread execution is complete!")
Volume of Cube: 8Volume of Square: 9Thread execution is complete!

Lernen wir nun, Threading als Unterklasse zu verwenden.,

Threading als Unterklasse

In diesem Abschnitt erfahren Sie, wie Sie eine Unterklasse aus der Thread-Klasse erstellen, die im Threading-Modul verfügbar ist, und dann Thread-Instanzen erstellen t1 und t2 aus dieser Klasse.

Sie würden auch hier dieselbe thread_delay Funktion verwenden.

Lassen Sie uns nun den obigen Code Schritt für Schritt verstehen:

  • Sie haben eine Klasse als DataCampThread definiert und im Klassenargument die threading.Thread Klasse übergeben., Der Grund dafür ist, dass Sie eine Unterklasse aus dem Threading-Modul erstellen möchten. Auf diese Weise können Sie alle Methoden verwenden, die in der Klasse threading.Thread verfügbar sind, ähnlich dem Konzept der Vererbung.

  • Als nächstes haben Sie die Init-Methode der DataCampThread-Klasse definiert und die Funktion zusammen mit der Verzögerung übergeben. Das init ist ein Konstruktor ähnlich den Parametern, die Sie an die threading.Thread Klasse übergeben haben, hier würden Sie an die DataCampThread Klasse übergeben.,

  • Dann initialisieren Sie die Init-Methode des Hauptthreading.Thread-Klasse und setzen dann Name und Verzögerung gleich.

  • Als nächstes definieren Sie dierun – Methode, und hier haben Sie diestart – Methode definiert, die im Grunde unter der Haube dierun – Methode aufruft. Da Sie die Hauptklasse geerbt haben, dürfen Sie Änderungen an der Methode run vornehmen., Wenn Sie also die Methode start aufrufen, werden alle Änderungen, die Sie an der Methode run vornehmen, jetzt angezeigt.

Fazit

Herzlichen Glückwunsch zum Abschluss des Tutorials.

Dieses Tutorial war eine grundlegende Einführung in das Threading in Python. Threading ist jedoch ein sehr umfangreiches und wichtiges Thema, und einige Konzepte wurden möglicherweise unerforscht. Fühlen Sie sich frei, mehr Threading-Methoden wie Active Count, Current Thread usw. zu betrachten.

Wenn Sie mehr erfahren möchten, dann schauen Sie sich auch Pythons Thread-basierte Parallelität an.,

Wenn Sie gerade erst mit Python angefangen haben und mehr erfahren möchten, nehmen Sie an der Einführung von DataCamp in Data Science in Python teil.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.