Threading in Python: Machen Sie Ihren Code intelligenter
Python ist großartig und das wissen wir. Aber, Kann es in Verarbeitungsaspekten intelligent genug sein? Threading zeigt den Weg.
Was ist Parallelität?
Frühere Maschinen hatten in der Regel nur einen Kern in der CPU, wo die gesamte Verarbeitung stattfand.
Warum ist die Anzahl der Kerne wichtig? Es liegt daran, dass sie die Fähigkeit der Maschine angibt, mehrere Dinge gleichzeitig zu bewältigen. Wenn Sie haben 16 Kerne, kann 16 verschiedene Operationen gleichzeitig durchführen.
Angenommen, Sie möchten 16 verschiedene Additionsoperationen durchführen, und nehmen wir an, jede Operation dauert 1 Sekunde. Auf einer Single-Core-Maschine, müssen Sie diese Operationen nacheinander durchführen, was bedeutet, dass 16 Additionsoperationen werden ausgeführt in 16 Sekunden. Jetzt, in einer Maschine mit 16 Kerne, können Sie die 16 Additionsoperationen auf jedem Kern gleichzeitig ausführen und die Arbeit erledigen 1 Sekunde. Benannt Parallelität.
Threading
Thread ist eine Reihe von Operationen, die ausgeführt werden müssen. Der Thread wird auf einem der CPU-Kerne implementiert. Notiz: 1 Ein Thread kann nur auf 1 Ader, kann nicht übertragen werden / Zahn wechseln
Lassen Sie uns zwei Threads auf einem Kern bereitstellen. Notiz: Ein Kern kann nur eine Sache gleichzeitig tun.

Jetzt können wir die beiden Threads so verarbeiten, wie wir wollen.
Zuerst, Wir können die Hälfte des ersten Threads verarbeiten.

Die Hälfte des nächsten Threads kann jetzt verarbeitet werden.

Der verbleibende Teil der Threads kann auf ähnliche Weise verarbeitet werden.

Das ist, was Threading ist Así es como ejecutamos diferentes cosas en el mismo núcleo de CPU. TLDR- Threading trata sobre cómo manejamos los hilos en un núcleo.
Notiz- La ejecución de subprocesos no implica la ejecución en varios núcleos. Se trata de cómo secuenciar el conjunto de programas (subprocesos) en el mismo núcleo. Im obigen Beispiel, le diremos a la CPU cómo secuenciar y ejecutar los dos subprocesos en el núcleo dado.
Eigentlich, puede ver la cantidad de subprocesos que se están ejecutando actualmente en su máquina. Unter Windows: vaya a Administrador de tareas → Rendimiento → CPU.
¿Por qué necesitamos enhebrar? ¿Por qué no podemos procesar un hilo a la vez y pasar al siguiente?
Manchmal, un hilo puede quedar colgado, lo que significa que se supone que está inactivo en ese momento. Das beste Beispiel ist die Funktion time.sleep (), das nichts anderes tut, als eine bestimmte Zeit zu warten. Während ein Thread inaktiv ist / hängend, können wir weitermachen und den anderen Thread verarbeiten, bis der vorherige Thread aktiviert wird. TLDR: wenn ein Thread wartet, kann er in der Zwischenzeit den anderen Thread verarbeiten.
Genau das nennen wir CAktuelle Berechnung.
Ein kleines Beispiel
Erklären wir das Multithreading mit einem kleinen Beispiel. Sehen Sie sich den folgenden Codeausschnitt an.
#Teil Eins des Codes
import time
print(1)
zeit.schlaf(10)
drucken('Fertig mit Schlafen')
drucken(2)
#Teil Zwei des Codes
drucken(3)
Wenn Sie den gesamten Code als einen einzigen Thread ausführen, wird der Code Schritt für Schritt ausgeführt. Zuerst, die Bibliothek wird importiert. Dann wird ausgegeben ‚1‘. Die Threads schlafen für 10 Sekunden. Es wird das nächste ausgegeben „2“ gefolgt von „Fertig mit Schlafen“ und schließlich wird ausgegeben „3“.
Ausgabe- 1 Done sleeping 2 3
Ahora digamos que está ejecutando el código como dos hilos. La primera parte como hilo y la segunda como hilo. (Notiz: standardmäßig, el código Python no está provisto con subprocesos; necesitamos importar el enhebrar biblioteca para hacerlo.)
Zuerst, se importa la biblioteca y luego se imprime ‚1‘. Ahora el hilo se va a dormir. Aquí es donde entra en acción el enhebrado.

El núcleo ahora cambia al otro hilo.

Ahora se imprime ‚3‘. Dado que todo el proceso se realiza en el subproceso 2, el núcleo ahora vuelve al subproceso 1 (que todavía está en suspensión).

Jetzt, Después de la duración del sueño, se imprime ‚2‘.
Entonces la salida será
Ausgabe- 1 3 Done sleeping 2
Praxisbeispiel
Wie immer, un concepto solo es claro cuando lo explicamos con un ejemplo del mundo real. Los procesos de E / S son los que se benefician del subproceso.
Supongamos que está viendo Shawshank Redemption en Netflix. Ahora suceden dos cosas mientras ve a Andy Dufresne sufrir en la cárcel: ein: la aplicación obtiene datos del servidor, Von: los datos obtenidos se le muestran como una película en la pantalla.

Imagínese cuál sería la situación sin enhebrar. Tendría que esperar a que el video se descargue de vez en cuando, ver el segmento que se obtuvo, esperar a que se descargue el siguiente segmento, etc.
Gracias al subproceso, podemos dividir los dos procesos en diferentes subprocesos. Mientras que un hilo obtiene datos (nämlich, está en modo de suspensión / suspensión), el otro hilo puede mostrarle el asombroso rendimiento de Morgan Freeman.
Es ist auch sehr nützlich für Sie als Datenwissenschaftler. Zum Beispiel, wenn Sie Daten von verschiedenen Webseiten extrahieren, können Sie diese einfach in mehreren Threads implementieren und es schneller machen. Sogar wenn Sie die Daten an einen Server senden, können Sie es in mehreren Threads tun, sodass, wenn ein Thread inaktiv ist, andere gestartet werden können.
Ein detailliertes Beispiel
Wie bereits erwähnt, standardmäßig, der Python-Code wird nicht mit Threads geliefert; wir müssen die Thread-Bibliothek importieren, um dies zu tun.
Schauen Sie sich den Code an.
import threading
import time
def sleepy_man(secs):
drucken('Beginne zu schlafen innen')
zeit.schlaf(secs)
drucken('Aufgewacht innen')
x = threading.Thread(Ziel = sleepy_man, Argumente = (1,))
x.start()
drucken(threading.activeCount())
zeit.schlaf(1.2)
drucken('Fertig')
Wenn Sie den obigen Code ausführen, erhalten Sie folgendes Ergebnis.
Ausgabe-
Beginne zu schlafen innen
2
Woke up inside
Done
Zuerst, déjame explicarte el código paso a paso. Luego analizaremos la salida.
- Importa la biblioteca enhebrar Ja Wetter. enhebrar es la biblioteca que nos permitirá crear hilos y Wetter es la biblioteca que contiene la función sleep.
- Die Funktion schläfriger_mann toma en un argumento Sekunden. Primero imprime ‚Empezando a dormir adentro‘. Entonces duerme por el Sekunden segundos y luego imprime ‚Desperté por dentro‘.
- Esta es la parte donde comenzamos a crear hilos. Necesitamos definir llamando a la clase hilo de rosca. Necesitamos pasar dos argumentos: Zielsetzung cuál es el bloque de funciones que necesita ser enhebrado, Argumente cuáles son los argumentos que deben pasarse a la función. Se devuelve un objeto de hilo que ahora se almacena en x.
x = threading.Thread(Ziel = sleepy_man, Argumente = (10,))
- Jetzt, después de definir la clase de hilo, necesitamos llamar a la función Anfang() Para iniciar el enhebrado
- Notiz- Ahora tenemos dos hilos. Ein Standard-Thread für das Programm und ein
neuer Thread, den wir definieren. Deswegen, die Anzahl der aktiven Threads ist zwei. - Deswegen, die Anweisung sollte drucken ‚2‘.
drucken(threading.activeCount())
Schauen wir uns jetzt den Kontrollfluss an. Sobald ich es aufrufe Anfang() Methode, schießen schläfriger_mann () und es auf einem separaten Thread ausgeführt wird. Das Hauptprogramm wird auch parallel als ein weiterer Thread ausgeführt. Der Ablauf wird im folgenden Bild gezeigt.

Erhöhen wir jetzt die Zeit, in der das Programm innerhalb der Funktion schläft.
import threading
import time
def sleepy_man(secs):
drucken('Beginne zu schlafen innen')
zeit.schlaf(secs)
drucken('Aufgewacht innen')
x = threading.Thread(Ziel = sleepy_man, Argumente = (4,))
x.start()
drucken(threading.activeCount())
zeit.schlaf(1.2)
drucken('Fertig')
Die Ausgabe ist wie folgt:
Beginne zu schlafen innen
2
Done
Woke up inside
Der Ablauf wird im Diagramm unten gezeigt:

Würzen wir die Sache jetzt ein wenig. Führen wir eine for-Schleife aus, die mehrere Threads startet.
import threading
import time
def sleepy_man(secs):
drucken('Beginne, im Inneren zu schlafen - Iteration {}'.format(5-secs))
zeit.schlaf(secs)
drucken('Aufgewacht im Inneren - Iteration {}'.format(5-secs))
für mich in Reichweite(3):
x = threading.Thread(Ziel = sleepy_man, Argumente = (5-ich,))
x.start()
drucken('Active threads- ', threading.activeCount())
In jeder Iteration, activamos un hilo. Tenga en cuenta que pasamos los argumentos 5, 4, 3 ein 1NS, 2Norddakota, Ja 3rd Iteración respectivamente. Deswegen, das schläfriger_mann () duerme 5 Sekunden, 4 segundos y 3 segundos respectivamente.
Deswegen, la salida es como se muestra:
Beginne zu schlafen innen - Iteration 0 Beginne zu schlafen innen - Iteration 1 Beginne zu schlafen innen - Iteration 2 Active threads- 4 Woke up inside - Iteration 2 Woke up inside - Iteration 1 Woke up inside - Iteration 0
Deswegen, hemos visto cómo se pueden definir y activar múltiples subprocesos, lo que garantiza una mejor forma de procesamiento, que es muy esencial para las operaciones de E / S pesadas.
Die in diesem Artikel gezeigten Medien sind nicht Eigentum von DataPeaker und werden nach Ermessen des Autors verwendet.



