2016-04-04 13 views
1

によって取得されたかどうかを確認する方法を、私が使用したい:のpython 3でRLOCKはPython 2ではどのスレッド

is_locked = rlock._RLock__count > 0 

そしてRLockは私の定期的なLockオブジェクトが持つ機能を与えるものではありませんので、これはですすなわち、locked()方法。 python 3では、プライベート変数_RLock__countさえ存在しません。

答えて

1

問題は、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() 
+0

この解決策の問題は、 'acquired'プロパティがチェックされ、ロックが特定のものになることを期待するアクションがコミットされている場合、競合状態が存在する可能性があることです状態。チェックとコードの実行の間で、ロックの状態が変わる可能性があります。 –

+0

これは、すべてのマルチスレッドプログラミングに固有の問題です。それが問題であれば、あなたは "あなたが跳躍する前に"ルックを取るのではなく、あなたが管理しているかどうかを知ることができます( "許可よりも許してもらいやすい")。 – Hetzroni

+0

@Loquaciousそれは私が最初の答えを好む理由です。あなたのアプリケーションは、何の問題もなく跳躍する前に見ることができますか?競争状態を避ける必要がある場合は、最初に指摘した2つの問題がない点に似た回答を見てください。そのような解決法は、より多くの人々に潜在的に有用である可能性がある。 –

1

ノンブロッキングモードでロックを取得し、取得されたロックを解放しようとすると、そうするのが適切であると考えられます。次の例は、これを行うことができる方法を示しています。

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() 
+0

それは私の問題を解決し、それはまだ2つの欠陥があります。 1.それは一時的に常に受け入れられないロックを取得します。 2.ロックを取得したスレッドでないスレッドから実行した場合のみ動作します。 – Hetzroni

+0

@Loquacious私はあなたの問題を解決する別の答えを提供しました。この回答は、少なくとも1人が有用であると判断したため、そのまま残されています。また、私の知る限りで競争条件を導入すべきではありません。 –

+0

はい、私は役に立ちました: – Hetzroni

関連する問題