によって取得されたかどうかを確認する方法を、私が使用したい:のpython 3でRLOCKはPython 2ではどのスレッド
is_locked = rlock._RLock__count > 0
そしてRLock
は私の定期的なLock
オブジェクトが持つ機能を与えるものではありませんので、これはですすなわち、locked()
方法。 python 3では、プライベート変数_RLock__count
さえ存在しません。
によって取得されたかどうかを確認する方法を、私が使用したい:のpython 3でRLOCKはPython 2ではどのスレッド
is_locked = rlock._RLock__count > 0
そしてRLock
は私の定期的なLock
オブジェクトが持つ機能を与えるものではありませんので、これはですすなわち、locked()
方法。 python 3では、プライベート変数_RLock__count
さえ存在しません。
問題は、Pythonの新しいバージョンに移行する場合__count
インスタンス属性が_count
に改名されたことがあるように思われます。簡単なAPIを提供するために、クラスが考案され、以下の例で実証されています。ロックがどのスレッド(現在のスレッドも含む)によって取得されたかどうかを調べることができます。
import random
import threading
def main():
lock = CustomRLock()
if random.randrange(2):
lock.acquire()
print('Lock was', end='')
if not lock.acquired:
print(' not', end='')
print(' acquired.')
class CustomRLock(threading._PyRLock):
@property
def acquired(self):
return bool(self._count)
if __name__ == '__main__':
main()
ノンブロッキングモードでロックを取得し、取得されたロックを解放しようとすると、そうするのが適切であると考えられます。次の例は、これを行うことができる方法を示しています。
import random
import threading
def main():
lock = Test().lock
print('The RLock was', end='')
if lock.acquire(False):
lock.release()
else:
print(' not', end='')
print(' acquired by the main thread.')
class Test(threading.Thread):
def __init__(self):
super().__init__()
self.__lock = threading.RLock()
def run(self):
if random.randrange(2):
self.__lock.acquire()
@property
def lock(self):
self.start()
self.join()
return self.__lock
if __name__ == '__main__':
main()
この解決策の問題は、 'acquired'プロパティがチェックされ、ロックが特定のものになることを期待するアクションがコミットされている場合、競合状態が存在する可能性があることです状態。チェックとコードの実行の間で、ロックの状態が変わる可能性があります。 –
これは、すべてのマルチスレッドプログラミングに固有の問題です。それが問題であれば、あなたは "あなたが跳躍する前に"ルックを取るのではなく、あなたが管理しているかどうかを知ることができます( "許可よりも許してもらいやすい")。 – Hetzroni
@Loquaciousそれは私が最初の答えを好む理由です。あなたのアプリケーションは、何の問題もなく跳躍する前に見ることができますか?競争状態を避ける必要がある場合は、最初に指摘した2つの問題がない点に似た回答を見てください。そのような解決法は、より多くの人々に潜在的に有用である可能性がある。 –