2013-05-28 14 views
8

Zastanawiam się nad wykorzystaniem zmiennej klasy jako blokady wątku, ponieważ nie lubię definiować blokady w zmiennych globalnych, a także chcę zapobiec zakleszczeniu. Czy to faktycznie działa? Przykład:Python: Czy mogę używać zmiennych klas jako blokad wątków?

import threading 

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

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

Biorąc pod uwagę, że nie będzie ponownie przypisać zmienną A.lock gdzieś wewnątrz lub na zewnątrz klasy, moje założenie byłoby, że jest on traktowany tak samo jak globalny zamka? Czy to jest poprawne?

+0

zły pomysł, aby wykorzystać go od problemów dziedziczenia. – Chameleon

+0

Czy możesz opracować? –

+0

Tak, opiszę: A.lock jest inicjowany przez Metaclass (jako typ domyślny) - wszystkie klasy odziedziczone po A będą miały tę samą blokadę, więc 'klasa B (A): pass' to' A.lock == B. lock', jeśli 'B' użyje' A.increase' spowoduje blokadę od podwójnego 'A.lock.aquire(); B.lock.aquire() # deadlock A.lock is B.lock'. Poprawny wzorzec jest zastępowany metaclass (typu defualt) z blokadą inicjalizacji klasy, co pozwala na dziedziczenie bezpieczne dla wątków. Nie próbuj używać w tym przypadku RLock, ponieważ prowadzi to do bardziej złożonych błędów. – Chameleon

Odpowiedz

2

Pewnie. Chcesz mieć odniesienie do zamka, do którego łatwo się dostać, a przechowywanie go na lekcji jest w porządku.

Możesz nazwać __lock (aby aktywować name mangling) chociaż, więc to nie jest mylone z zamkami w podklasach A

Powiązane problemy