2013-05-28 19 views
8

Küresel değişkenler içinde bir kilit tanımlamak istemediğimden ve ayrıca kilitlenmeyi önlemek istediğimden, bir sınıf değişkeni thread lock olarak kullanmayı düşünüyordum. Bu gerçekten çalışıyor mu? Örnek:Python: Sınıf değişkenlerini iplik kilitleri olarak kullanabilir miyim?

import threading 

class A(object): 
    lock = threading.Lock() 
    a = 1 

    @classmethod 
    def increase_a(cls): 
     with cls.lock: 
      cls.a += 1 

ben sınıfın içinde veya dışında bir yerde A.lock değişkeni yeniden atama olmaz göz önüne alındığında, benim varsayım küresel bir kilit aynı şekilde ele alınır olurdu? Bu doğru mu?

+0

Kötü düşüncenin alt sınıflarda kilitleri ile karıştırılmamalıdır değil. – Chameleon

+0

Ayrıntılı bilgi verir misiniz? –

+0

Evet, ayrıntılı bir şekilde çalışacağım: A.lock A metaclass (varsayılan tür olarak) tarafından başlatılır - A'dan alınan tüm sınıflar aynı kilidi paylaşır, böylece sınıf B (A): pass 'olur A.lock == B lock '' '' '' '' '' '' '' '' yi kullanacaksa, çifte yana kilitlenecektir A. A.lock.aquire(); B.lock.aquire() # deadlock A.lock, B.lock'tur. Geçerli model, sınıf başlatma kilidi ile metaclass (defualt tipi) değiştirilir, bu, thread güvenli mirasına izin verir. Bu durumda RLock kullanmayı denemeyin çünkü daha karmaşık hatalara yol açacaktır. – Chameleon

cevap

2

Elbette. Almak için kolay bir kilit referansı almak ve sınıfta saklamak iyi.

Bunu __lock olsa ( name mangling aktive etmek) aramak isteyebilirsiniz

, bu yüzden miras sorunların beri kullanmaya A

İlgili konular