Mutex in Python

Ishaan Shrivastava 22 Oktober 2021
Mutex in Python

Mutex bedeutet gegenseitiger Ausschluss. Dies bedeutet, dass zu einem bestimmten Zeitpunkt nur ein Thread eine bestimmte Ressource verwenden kann. Wenn ein Programm mehrere Threads hat, schränkt der gegenseitige Ausschluss die Threads ein, diese bestimmte Ressource gleichzeitig zu verwenden. Es sperrt die anderen Threads und schränkt deren Eintritt in den kritischen Abschnitt ein.

In diesem Tutorial wird die Verwendung von Mutex in Python demonstriert.

Um Mutex in Python zu implementieren, können wir die Funktion lock() aus dem Modul threading verwenden, um die Threads zu sperren. Wenn der zweite Thread vor dem ersten Thread beendet wird, wartet er, bis der erste Thread fertig ist. Wir sperren den zweiten Thread, um dies sicherzustellen, und lassen ihn dann warten, bis der erste Thread fertig ist. Und wenn der erste Thread fertig ist, geben wir die Sperre des zweiten Threads frei.

Siehe den unten angegebenen Code.

import threading
import time
import random

mutex = threading.Lock()


class thread_one(threading.Thread):
    def run(self):
        global mutex
        print("The first thread is now sleeping")
        time.sleep(random.randint(1, 5))
        print("First thread is finished")
        mutex.release()


class thread_two(threading.Thread):
    def run(self):
        global mutex
        print("The second thread is now sleeping")
        time.sleep(random.randint(1, 5))
        mutex.acquire()
        print("Second thread is finished")


mutex.acquire()
t1 = thread_one()
t2 = thread_two()
t1.start()
t2.start()

Ausgabe:

The first thread is now sleeping
The second thread is now sleeping
First thread is finished
Second thread is finished

In diesem Code wird der zweite Thread erst freigegeben, wenn der erste Thread fertig ist. Der zweite Thread wartet auf den ersten Thread in der Sperre. Das Schlüsselwort global wird im Code verwendet, da beide Threads es verwenden. Beachten Sie, dass die Anweisung print direkt nach der Anweisung acquire kommt, nicht vorher, denn solange der Thread wartet, ist er noch nicht fertig.

Daher ist es sehr wichtig, die Gewinde zu sperren. Andernfalls kann es zum Absturz der Anwendung kommen, wenn zwei Threads gleichzeitig dieselbe Ressource verwenden.