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
変数を再割り当てないでしょう考えると、私の仮定は、それが世界的なロックと同じように扱われていることでしょうか?これは正しいです?
悪いアイデアのサブクラス内のロックと混同していないので、しかし(name manglingを活性化するため)
__lock
それを呼び出したいことがあります。 – Chameleonあなたは精緻化できますか? –
はい、私は詳しく述べます:A.lockはAメタクラス(デフォルトタイプ)で初期化されます - Aから継承されたすべてのクラスは同じロックを共有するので、 'class B(A):pass'はA.lock == Bです。 'B 'が' A.increase'を使用する場合は 'lock'になります。これはdouble' A.lock.aquire(); B.lock.aquire()#deadlock A.lock is B.lock'です。有効なパターンは、メタクラス(defualt型)をクラス初期化ロックに置き換えることで、スレッドセーフな継承が可能になります。より複雑なバグにつながるので、この場合はRLockを使用しないでください。 – Chameleon