Parallelität in Python - Einführung

In diesem Kapitel werden wir das Konzept der Parallelität in Python verstehen und die verschiedenen Threads und Prozesse kennenlernen.

Was ist Parallelität?

Mit einfachen Worten, Parallelität ist das gleichzeitige Auftreten von zwei oder mehr Ereignissen. Parallelität ist ein natürliches Phänomen, da viele Ereignisse gleichzeitig auftreten.

Parallelität ist in Bezug auf die Programmierung, wenn sich zwei Aufgaben bei der Ausführung überschneiden. Durch die gleichzeitige Programmierung kann die Leistung unserer Anwendungen und Softwaresysteme verbessert werden, da wir die Anforderungen gleichzeitig bearbeiten können, anstatt darauf zu warten, dass eine vorherige abgeschlossen wird.

Historischer Rückblick auf die Parallelität

Die folgenden Punkte geben uns einen kurzen historischen Überblick über die Parallelität -

Aus dem Konzept der Eisenbahnen

Parallelität ist eng mit dem Konzept der Eisenbahnen verbunden. Bei den Eisenbahnen mussten mehrere Züge im selben Eisenbahnsystem so umgeschlagen werden, dass jeder Zug sicher ans Ziel kam.

Concurrent Computing im akademischen Bereich

Das Interesse an Parallelität in der Informatik begann mit dem 1965 von Edsger W. Dijkstra veröffentlichten Forschungsbericht. In diesem Artikel identifizierte und löste er das Problem des gegenseitigen Ausschlusses, die Eigenschaft der Parallelitätskontrolle.

Parallelitätsprimitive auf hoher Ebene

In jüngster Zeit erhalten Programmierer aufgrund der Einführung von Parallelitätsprimitiven auf hoher Ebene verbesserte gleichzeitige Lösungen.

Verbesserte Parallelität mit Programmiersprachen

Programmiersprachen wie Golang, Rust und Python von Google haben unglaubliche Entwicklungen in Bereichen gemacht, die uns helfen, bessere gleichzeitige Lösungen zu erhalten.

Was ist Thread & Multithreading?

Threadist die kleinste Ausführungseinheit, die in einem Betriebssystem ausgeführt werden kann. Es ist selbst kein Programm, sondern läuft innerhalb eines Programms. Mit anderen Worten, Threads sind nicht unabhängig voneinander. Jeder Thread teilt den Codeabschnitt, den Datenabschnitt usw. mit anderen Threads. Sie werden auch als Leichtbauprozesse bezeichnet.

Ein Thread besteht aus folgenden Komponenten:

  • Programmzähler, der aus der Adresse des nächsten ausführbaren Befehls besteht

  • Stack

  • Registersatz

  • Eine eindeutige ID

MultithreadingAuf der anderen Seite ist die Fähigkeit einer CPU, die Verwendung des Betriebssystems durch gleichzeitiges Ausführen mehrerer Threads zu verwalten. Die Hauptidee von Multithreading besteht darin, Parallelität zu erreichen, indem ein Prozess in mehrere Threads aufgeteilt wird. Das Konzept des Multithreading kann anhand des folgenden Beispiels verstanden werden.

Beispiel

Angenommen, wir führen einen bestimmten Prozess aus, bei dem wir MS Word öffnen, um Inhalte einzugeben. Ein Thread wird zum Öffnen von MS Word zugewiesen, und ein anderer Thread wird zum Eingeben von Inhalten benötigt. Und jetzt, wenn wir das vorhandene bearbeiten möchten, wird ein anderer Thread benötigt, um die Bearbeitungsaufgabe zu erledigen und so weiter.

Was ist Prozess & Multiprocessing?

EINprocesswird als eine Entität definiert, die die grundlegende Arbeitseinheit darstellt, die im System implementiert werden soll. Einfach ausgedrückt schreiben wir unsere Computerprogramme in eine Textdatei. Wenn wir dieses Programm ausführen, wird es zu einem Prozess, der alle im Programm genannten Aufgaben ausführt. Während des Prozesslebenszyklus durchläuft es verschiedene Phasen - Start, Bereit, Ausführen, Warten und Beenden.

Das folgende Diagramm zeigt die verschiedenen Phasen eines Prozesses -

Ein Prozess kann nur einen Thread haben, der als primärer Thread bezeichnet wird, oder mehrere Threads mit einem eigenen Satz von Registern, Programmzählern und Stapeln. Das folgende Diagramm zeigt uns den Unterschied -

Multiprocessing,Zum anderen werden zwei oder mehr CPU-Einheiten in einem einzigen Computersystem verwendet. Unser primäres Ziel ist es, das volle Potenzial unserer Hardware auszuschöpfen. Um dies zu erreichen, müssen wir die gesamte Anzahl der in unserem Computersystem verfügbaren CPU-Kerne verwenden. Multiprocessing ist der beste Ansatz dafür.

Python ist eine der beliebtesten Programmiersprachen. Im Folgenden sind einige Gründe aufgeführt, die es für gleichzeitige Anwendungen geeignet machen:

Syntethischer Zucker

Syntaktischer Zucker ist eine Syntax innerhalb einer Programmiersprache, die das Lesen oder Ausdrücken erleichtern soll. Es macht die Sprache für den menschlichen Gebrauch „süßer“: Dinge können klarer, präziser oder in einem alternativen Stil ausgedrückt werden, der auf Präferenzen basiert. Python wird mit Magic-Methoden geliefert, die so definiert werden können, dass sie auf Objekte wirken. Diese Magic-Methoden werden als syntaktischer Zucker verwendet und sind an leichter verständliche Schlüsselwörter gebunden.

Große Gemeinschaft

Die Python-Sprache hat eine massive Akzeptanzrate bei Datenwissenschaftlern und Mathematikern erlebt, die auf den Gebieten KI, maschinelles Lernen, tiefes Lernen und quantitative Analyse tätig sind.

Nützliche APIs für die gleichzeitige Programmierung

Python 2 und 3 verfügen über eine große Anzahl von APIs, die für die parallele / gleichzeitige Programmierung vorgesehen sind. Am beliebtesten sind siethreading, concurrent.features, multiprocessing, asyncio, gevent and greenlets, etc.

Einschränkungen von Python bei der Implementierung gleichzeitiger Anwendungen

Python hat eine Einschränkung für gleichzeitige Anwendungen. Diese Einschränkung wird aufgerufenGIL (Global Interpreter Lock)ist in Python vorhanden. GIL erlaubt uns niemals, mehrere CPU-Kerne zu verwenden, und daher können wir sagen, dass es in Python keine echten Threads gibt. Wir können das Konzept von GIL wie folgt verstehen:

GIL (Global Interpreter Lock)

Es ist eines der umstrittensten Themen in der Python-Welt. In CPython ist GIL der Mutex - die gegenseitige Ausschlusssperre, die die Thread-Sicherheit erhöht. Mit anderen Worten, wir können sagen, dass GIL verhindert, dass mehrere Threads Python-Code parallel ausführen. Die Sperre kann jeweils nur von einem Thread gehalten werden. Wenn ein Thread ausgeführt werden soll, muss er zuerst die Sperre erwerben. Das folgende Diagramm hilft Ihnen, die Funktionsweise von GIL zu verstehen.

Es gibt jedoch einige Bibliotheken und Implementierungen in Python, wie z Numpy, Jpython und IronPytbhon. Diese Bibliotheken funktionieren ohne Interaktion mit GIL.