2

threading.lock を使用してオブジェクトをロックできるクラスを作成しようとしています:

class ObjectLock(object):
    def __init__(self):
        self._lock = threading.Lock()
        self._value = False
    def __str__(self):
        self.acquire() 
        try: 
            if(self._value):
                return self._value
            else:
                return self._value
        finally: 
            self.release() 
    def __enter__(self):
        self.acquire()
    def __exit__(self, type, value, traceback):
        self.release()
    def acquire(self):   
        self._lock.acquire()
    def release(self):
        self._lock.release() 
    def locked(self):
        return self._lock.locked()

lock = ObjectLock()

print(lock)
with lock:
    print (lock)

問題は、「with」を実装しようとしていることです。「with」ブロック内でメソッドが呼び出された場合(strなど、ロックが再取得されます...これは悪いことです。ロック内で作業していることがわかったときに呼び出すメソッドの別のセットを作成する必要がありますか? ?

4

4 に答える 4

2

まず、ロックを取得する必要がある理由がわからない__str__ので、その前提は意味がないと思います。

内部ロックが望ましいと確信している場合は、リエントラント ロックの使用を検討してthreading.RLockください。このようにして、単一のスレッドは、デッドロックすることなく、必要な回数だけロックを取得できます。

于 2013-03-04T19:10:28.383 に答える
1

を使用する代わりに、をthreading.Lock使用してthreading.Rlockください。これは再入可能なロックであり、同じスレッドがロックを複数回取得できるようにします。

于 2013-03-04T19:10:56.277 に答える
0

ロック内で作業していることがわかっているときに呼び出すメソッドのセットを個別に作成する必要がありますか?

いいえ。これはすでに行われています。クラス(再入可能ロック)がこれthreading.RLockを処理し、と同じインターフェイスを実装しますLock

Rキャラクターは魔法のようにあなたの問題を振り払うでしょう。

于 2013-03-04T19:20:47.413 に答える
0

再入可能ロックを使用する (threading.RLock)

于 2013-03-04T19:10:44.080 に答える