私が出会った Python ドキュメントを読んでいRLock
ます。
誰かが私に(例を挙げて)どのシナリオRLock
が好ましいかを説明できますかLock
?
特に以下を参照してください。
RLock
の「再帰レベル」。これはどのように役立ちますか?RLock
オブジェクトのスレッド「所有権」- パフォーマンス?
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
これにより、次のことが保証されます。