Python -Fadenschloss

Python -Fadenschloss
In Python gibt es zwei Schlosszustände: verschlossen und entsperrt. Das Schloss ist die Klasse der Python -Threading -Bibliothek. Wir müssen nur das Schloss importieren, während wir das Sperre im Gewinde verwenden. Das erste Verfahren für das Schloss ist "Acquire ()" und der zweite Ansatz ist "Release ()". In Python sind Schlösser die grundlegendste Synchronisation Primitive.

Beispiel Nr. 1: Python -Thread -Skriptausführung mit Timeout in Acquire () Lock.

Wir werden die Verwendung der Methode „Acquire ()“ der Sperre in diesem Beispiel diskutieren. Mit der Methode „Acquire ()“ kann zum Sperren verwendet werden. Es dürfen keine Anstrengungen unternommen werden, um dies zu erreichen, bis das Schloss veröffentlicht wurde, sobald ein Faden das Schloss gesperrt hat. Mit der Methode „Acquire ()“ kann ein Schloss sichern. Sobald ein Faden das Schloss gesichert hat, dürfen dies keine weiteren Versuche unternommen werden, bis das Schloss veröffentlicht wurde. Die Option „Timeout“ wird auch in dieser Instanz der Methode „Acquire ()“ verwendet, um festzustellen. Wenn der potenzielle Wert des Fadens 1 ist, was 1 ist, wird der Faden auf unbestimmte Zeit verzögert, bis er das Schloss erwerbt. Hier haben wir dies verwendet, um festzustellen, wie lange ein Thread nach einem Schloss sucht.

Beginnen wir mit der Implementierung des Skripts mit dem Tool "Spyder", um den Code zu implementieren. Wir werden zuerst Sperre und Faden aus der Python -Threading -Bibliothek importieren. Themen werden in einem Python -Prozess verwendet, um die Codeausführung durchzuführen. Jedes Programm hat standardmäßig einen Thread, aber wir müssen möglicherweise mehr Threads produzieren, wenn wir mehrere Prozesse gleichzeitig durchführen möchten. Das Schlafmodul wird dann importiert. Die Methode „Sleep ()“ in Pythons Zeitmodul wird verwendet, um die Ausführung eines Programms für eine vorgegebene Zeitspanne zu pausieren. Dies deutet darauf hin, dass das Programm vor der automatischen Ausführung des Programms nach einem vorgegebenen Zeitraum vorübergehend ausgesetzt wird. Als nächstes wird die Methode "lock ()" verwendet. In der folgenden Zeile definieren wir dann eine Funktion mit dem Namen "Func1" und übergeben die Variable "Sperre" in seinen Klammern.

Die Anweisung "if" ermöglicht die Ausführung einer Anweisung oder eine Reihe von Aussagen unter bestimmten Umständen, die auf dem Ergebnis eines Ausdrucks basieren. Wir verwenden die Methode „Acquire ()“ auf dem Sperrenobjekt in der Bedingung „If“, damit der Thread ständig auf die Sperre warten würde. Wir geben eine Zeitüberschreitung als eine seiner Parameter über und setzen sie in den Klammern der Funktion „Acquire ()“ auf „10“. Wenn die Anweisung nun die Anforderung erfüllt, verwenden wir die Funktion „print ()“, übergeben Sie die Anweisung „Thread 2: Fertig“ in ihren Klammern und rufen dann die Release () -Methode auf einem Sperrobjektmodul auf. Wenn das Schloss gesperrt ist, reagiert dieser Vorgang, nachdem es in seinen entsperrten Zustand zurückgekehrt ist.

Zusätzlich kann diese Methode von jedem Thread aufgerufen werden. Es ist für einen der Fäden zulässig, die bereits darauf warten, den Halt zu erwerben, um daran festzuhalten, bis diese Funktion aufgerufen wird. Wir drucken jetzt die Anweisung "Thread 1: Timeout", wenn die Bedingung nicht erfüllt ist. Wir werden nun eine neue Funktion mit dem Namen „Func“ und der Parametersperrung in der folgenden Zeile erstellen. Mithilfe des Sperrobjekts führen wir die Methode „Acquire ()“ aus. In der folgenden Zeile rufen wir dann die Funktion „print ()“ auf und geben die Anweisung „Thread 1: Done“ an, bevor wir die Methode „Release ()“ mit der Sperre verwenden.

Wir erstellen nun einen Thread und rufen die Methoden des Threads auf, indem wir das Thread -Objekt aufrufen. Wir haben einen Thread verwendet und "target = func" in ihm gesetzt, um das Argument "Sperre" zu übergeben, "Lock", "Lock", "Lock", "Lock", "Lock", "Lock", "Lock" übergeben. Dann haben wir diesen Thread in einer Variablen mit dem Namen „Thread1) gespeichert.In der nächsten Zeile haben wir "func1" mit dem Thread bezeichnet und das Argument "Sperre" mit "Thread1" übergeben.start () “, um den Thread zu starten. Wir haben dasselbe für Thread2 gemacht. Die Methode „Join ()“ wird dann verwendet, um auf die Ausführung von Threads zu warten. So haben wir zwei Themen, von denen jeweils zwei verschiedene Routinen bezeichnet. Die Zeitüberschreitung für den zweiten Thread beträgt 10 Sekunden, während der erste Thread für „2“ Sekunden funktioniert.

Die Ausgangsanzeige zeigt nun, dass Thread 1 zuerst erstellt wird, da er zuerst erstellt wurde und auf das Schloss zugreifen und seine Ausführung beenden konnte. Thread 2 ist fertig.

Beispiel Nr. 2: Verwenden Sie Pythons Thread -Sperre in einem Rennzustand

Wir werden in diesem Beispiel eine Python -Thread -Sperre in einem Rennzustand verwenden. Eine Rennbedingung tritt auf, wenn zwei Threads gleichzeitig eine gemeinsame Variable betrachten. Die anfänglichen und zweiten Threads erhielten das gleiche Ergebnis aus der Konstante des ursprünglichen Threads. Dann versuchen die beiden Threads, den gemeinsamen Wert der abhängigen Variablen zu ändern. Die Daten aus dem Thread, der zur freigegebenen Variablenliste hinzufügt.

Lassen Sie uns den Code implementieren. In der ersten Zeile importieren wir das Sperrmodul aus dem Threading -Modul. Und in der folgenden Zeile importieren wir das Zeitmodul. Dann erstellen wir eine Variable und geben ihr den Wert "20". In der nächsten Zeile erstellen wir eine Funktion namens "Func1" und übergeben zwei Variablen "Inkrement" und "Sperren" als Parameter. Wir erstellen eine globale Variable namens „A“ und geben ihr ein Schloss über.

Schließlich erstellen wir in der folgenden Zeile eine Variable namens "local_counter" und geben sie in sie weiter. Der Wert dieses „lokalen Zählers“ wird in der nächsten Zeile erhöht, je nachdem, welcher Faden zuletzt ist. Dann nennen wir die „Zeit.Sleep () ”Methode und liefern eine Zeit von„ 0.5 ”Sekunden in der folgenden Zeile. Die Methode "print ()" wird dann ausgeführt und der lokale Zähler wird in der Variablen "A" gespeichert. Innerhalb dieser Funktion wird der aktuelle Thread unter Verwendung von Threading aufgerufen.Current_Thread ().Name des Namens Inkremente A nach Inkrement “und übergibt das„ A “, in dem der Wert gespeichert wird, und die Methode„ Release () “mit Sperre wird in der folgenden Zeile aufgerufen. In der nächsten Zeile passieren wir die Lock () -Methode.

Jetzt erstellen wir zwei Threads und rufen die Funktion mit den Threads auf. Wir rufen die Funktion im ersten Thread mithilfe von Threading auf.Thread, verwendet "target = func1" und passiere das Argument "15" als Inkrement und "Sperre". Wir haben diesen ersten Thread in der Variablen "T1" gespeichert und wiederholen den gleichen Vorgang für Thread 2, übergeben jedoch das Argument, das das Inkrement von "5" und "Sperre" ist. Dann verwenden wir „Thread“.start () ”, um den Thread zu starten und„ join () “zu warten, bis der Thread läuft. Der Endwert wird dann angezeigt.

Setzen Sie nun einfach diesen Code ein, führt dazu, dass beide Threads den Wert lesen. "T1" und "T2" werden versuchen, den Wert von "A" in der Inkrementfunktion unter Verwendung der Inkrementwerte "15" und "5" zu ändern, die im Parameter -Tuple enthalten sind.

Jetzt zeigt es das Endergebnis „40“ in der Ausgabe. Da wir im obigen Code „a = 20“ haben, dann ist das Ergebnis „35“, wenn „Thread 1“ um „15“ erhöht wird, und der Wert ändert sich jedoch auf „35“, wenn „Thread 2“ um „5“ zunimmt, wenn „5“ zunimmt. Das Ergebnis ist "40".

Abschluss

Die Python -Thread -Sperrfunktion mit zwei Methoden: Acquire () und Release () wird in diesem Artikel behandelt. In diesem Leitfaden werden zwei Beispiele vorgestellt. In erster Linie haben wir ein Timeout in einem Access () -Srock verwendet und im zweiten Beispiel einen Rennbeding. Wir gehen davon aus, dass Sie diese Fälle hilfreich finden, wenn Sie Python -Thread -Sperren verwenden.