Pythons threading
-Modul bietet zwei wichtige Synchronisierungstools: Lock
und RLock
, die beide dazu dienen, den Zugriff auf gemeinsam genutzte Ressourcen in Multithread-Anwendungen zu steuern. Ihre Funktionalitäten unterscheiden sich jedoch erheblich.
1. Lock
(threading.Lock)
-
Mechanismus: Ein grundlegender Verriegelungsmechanismus. Es kann jeweils nur ein Thread die Sperre halten. Jeder andere Thread, der eine Erfassung versucht, wird blockiert, bis die Sperre aufgehoben wird.
-
Wiedereintritt: Nicht-Wiedereintritt. Ein Thread, der die Sperre bereits besitzt, kann sie nicht erneut erwerben. Der Versuch, dies zu tun, führt zu einem Deadlock.
-
Anwendung:Ideal für Situationen, in denen ein Thread die Sperre nur einmal benötigt und sie nach Abschluss der Aufgabe freigegeben wird.
Lock
Beispiel:
<code class="language-python">import threading
lock = threading.Lock()
def critical_section():
lock.acquire()
try:
print(f"{threading.current_thread().name} is accessing the shared resource.")
finally:
lock.release()
thread1 = threading.Thread(target=critical_section)
thread2 = threading.Thread(target=critical_section)
thread1.start()
thread2.start()
thread1.join()
thread2.join()</code>
2. RLock
(threading.RLock)
-
Mechanismus: Eine wiedereintretende Sperre, die es einem Thread ermöglicht, dieselbe Sperre mehrmals zu erhalten, ohne einen Deadlock zu verursachen. Jede Akquisition erfordert eine entsprechende Freigabe.
-
Wiedereintritt:Wiedereintritt. Ein Thread kann die Sperre, die er bereits hält, wiedererlangen, sofern er sie genauso oft freigibt.
-
Anwendung: Geeignet für Szenarien mit rekursiven Funktionen oder verschachtelten, durch Sperren geschützten Vorgängen, bei denen ein Thread möglicherweise wiederholt dieselbe Sperre benötigt.
RLock
Beispiel:
<code class="language-python">import threading
rlock = threading.RLock()
def recursive_task(count):
rlock.acquire()
try:
print(f"{threading.current_thread().name} acquired the lock; count = {count}")
if count > 0:
recursive_task(count - 1) # Recursive call; re-acquires the lock
finally:
rlock.release()
thread = threading.Thread(target=recursive_task, args=(3,))
thread.start()
thread.join()</code>
Hauptunterschiede: Lock
vs. RLock
Funktion |
Feature |
Lock (threading.Lock) |
RLock (threading.RLock) |
Reentrancy |
Non-reentrant |
Reentrant |
Use Case |
Simple locking |
Recursive/nested locking |
Performance |
Generally faster |
Slightly more overhead |
(threading.Lock) |
(threading.RLock) |
Wiedereintritt |
Nicht wiedereintretend |
Wiedereinsteiger |
Anwendungsfall |
Einfache Verriegelung |
Rekursives/verschachteltes Sperren |
Leistung |
Im Allgemeinen schneller |
Etwas mehr Aufwand |
Lock
Auswahl zwischen RLock
und
-
Lock
Bevorzugen für einfache Sperrszenarien, bei denen ein erneuter Eintritt nicht erforderlich ist. Es ist einfacher und oft schneller.-
RLock
Entscheiden Sie sich für , wenn Sie mit rekursiven Funktionen oder verschachtelten Sperren arbeiten, um mögliche Deadlocks zu vermeiden. Die zusätzliche Komplexität wird durch die Vermeidung von Deadlocks in diesen spezifischen Situationen gerechtfertigt.
Das obige ist der detaillierte Inhalt vonR-Lock vs. Lock in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Stellungnahme:Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn