Ich habe über eine Klassenvariable als Threadsperre nachgedacht, da ich nicht gerne eine Sperre innerhalb der globalen Variablen definieren und auch Deadlock verhindern möchte. Funktioniert das tatsächlich? Beispiel:Python: Kann ich Klassenvariablen als Thread-Sperren verwenden?
import threading
class A(object):
lock = threading.Lock()
a = 1
@classmethod
def increase_a(cls):
with cls.lock:
cls.a += 1
bedenken, dass ich würde die A.lock
Variable irgendwo innerhalb oder außerhalb der Klasse nicht neu zuweisen, wäre meine Vermutung, dass es das gleiche wie eine globale Sperre behandelt wird? Ist das richtig?
Schlechte Idee, es zu benutzen, da Vererbung Probleme verwirrt. – Chameleon
Können Sie es ausarbeiten? –
Ja, ich werde ausführen: A.lock wird von einer Metaklasse (als Standardtyp) initialisiert - alle von A geerbten Klassen teilen sich die gleiche Sperre, also 'Klasse B (A): pass 'sei' A.lock == B. lock 'wenn' B' 'A.increase' verwendet, führt das zum Sperren seit double' A.lock.aquire(); B.lock.aquire() # Deadlock A.lock ist B.lock'. Gültiges Muster ist das Ersetzen der Metaklasse (defualt type) durch die Klasseninitialisierungssperre, die eine threadsichere Vererbung ermöglicht. Versuchen Sie nicht, in diesem Fall RLock zu verwenden, da dies zu komplexeren Fehlern führen wird. – Chameleon