2013-05-28 3 views
8

Я думал об использовании переменной класса в качестве блокировки потока, поскольку мне не нравится определять блокировку в глобальных переменных и также хочу предотвратить тупик. Это действительно работает? Пример:Python: Могу ли я использовать переменные класса в качестве блокировок потоков?

import threading 

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

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

Учитывая я бы не переназначить переменную A.lock где-то внутри или вне класса, мое предположение было бы, что она обрабатывается так же, как глобальный замок? Это верно?

+0

плохая идея использовать его, так как проблемы наследования. – Chameleon

+0

Можете ли вы уточнить? –

+0

Да, я уточню: A.lock инициализируется метаклассом (как тип по умолчанию) - все классы, унаследованные от A, будут совместно использовать одну и ту же блокировку, поэтому 'class B (A): pass' be' A.lock == B. lock', если 'B' будет использовать' A.increase', это приведет к блокировке с двойного 'A.lock.aquire(); B.lock.aquire() # deadlock A.lock - B.lock'. Допустимый шаблон заменяет метаклас (defualt type) с блокировкой инициализации класса, что позволит потокобезопасное наследование. Не пытайтесь использовать в этом случае RLock, поскольку это приведет к более сложным ошибкам. – Chameleon

ответ

2

Несомненно. Вы хотите иметь ссылку на блокировку, на которую легко попасть, и хранить ее в классе просто отлично.

Вы можете назвать его __lock (активировать name mangling), хотя, так что не путать с замками в подклассах A