70

私が出会った Python ドキュメントを読んでいRLockます。

誰かが私に(例を挙げて)どのシナリオRLockが好ましいかを説明できますかLock

特に以下を参照してください。

  • RLockの「再帰レベル」。これはどのように役立ちますか?
  • RLockオブジェクトのスレッド「所有権」
  • パフォーマンス?
4

3 に答える 3

6

RLock の別の使用例を次に示します。同時アクセスをサポートする Web 向けのユーザー インターフェイスがあるが、外部リソースへの特定の種類のアクセスを管理する必要があるとします。たとえば、メモリ内のオブジェクトとデータベース内のオブジェクトとの間の一貫性を維持する必要があり、データベースへのアクセスを制御するマネージャー クラスがあり、メソッドが特定の順序で呼び出され、決して同時に呼び出されないようにする必要があるとします。

できることは、RLock を作成し、RLock へのアクセスを制御するガーディアン スレッドを作成することです。これは、常に RLock を取得し、シグナルが送信された場合にのみ解放します。次に、アクセスを制御する必要があるすべてのメソッドが実行前にロックを取得するようにします。このようなもの:

def guardian_func():
    while True:
        WebFacingInterface.guardian_allow_access.clear()
        ResourceManager.resource_lock.acquire()
        WebFacingInterface.guardian_allow_access.wait()
        ResourceManager.resource_lock.release()

class WebFacingInterface(object):
    guardian_allow_access = Event()
    resource_guardian = Thread(None, guardian_func, 'Guardian', [])
    resource_manager = ResourceManager()

    @classmethod
    def resource_modifying_method(cls):
        cls.guardian_allow_access.set()
        cls.resource_manager.resource_lock.acquire()
        cls.resource_manager.update_this()
        cls.resource_manager.update_that()
        cls.resource_manager.resource_lock.release()

class ResourceManager(object):
    resource_lock = RLock()

    def update_this(self):
        if self.resource_lock.acquire(False):
            try:
                pass # do something
                return True

            finally:
                self.resource_lock.release()
        else:
            return False

    def update_that(self):
        if self.resource_lock.acquire(False):
            try:
                pass # do something else
                return True
            finally:
                self.resource_lock.release()
        else:
            return False

これにより、次のことが保証されます。

  1. RLock は再帰的であるため、スレッドがリソース ロックを取得すると、リソース マネージャーの保護されたメソッドを自由に呼び出すことができます。
  2. スレッドが Web 向けインターフェイスのマスター メソッドを介してリソース ロックを取得すると、マネージャー内の保護されたメソッドへのすべてのアクセスが他のスレッドからブロックされます。
  3. マネージャー内の保護されたメソッドは、最初にガーディアンにアピールすることによってのみアクセスできます。
于 2015-10-15T18:32:27.447 に答える