2013-05-28 29 views
8

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?

+0

Schlechte Idee, es zu benutzen, da Vererbung Probleme verwirrt. – Chameleon

+0

Können Sie es ausarbeiten? –

+0

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

Antwort

2

Sicher. Sie möchten einen Verweis auf die Sperre, die leicht zu bekommen ist, und speichern Sie es auf der Klasse ist in Ordnung.

Vielleicht möchten Sie es nennen __lock (name mangling zu aktivieren) ist es allerdings so nicht mit Schlössern in Subklassen von A