【发布时间】:2021-10-28 00:12:31
【问题描述】:
我需要一个 Lock 对象,类似于multiprocessing.Manager().Lock() 只允许从实际获得它的进程中释放。
我的手动实现类似于以下内容:
class KeyLock:
def __init__(self):
self._lock = Lock()
self._key: Optional[str] = None
def acquire(self, key: 'str', blocking: bool = True, timeout: float = 10.0) -> bool:
if self._lock.acquire(blocking=blocking, timeout=timeout):
self._key = key
return True
return False
def release(self, key, raise_error: bool = False) -> bool:
if self._key == key:
self._lock.release()
return True
if raise_error:
raise RuntimeError(
'KeyLock.released called with a non matchin key!'
)
return False
def locked(self):
return self._lock.locked()
要创建此锁的实例并从多个进程中使用它,我将使用自定义管理器类:
class KeyLockManager(BaseManager):
pass
KeyLockManager.register('KeyLock', KeyLock)
manager = KeyLockManager()
manager.start()
lock = manager.KeyLock()
然后我可以从不同的过程中做:
lock.acquire(os.getpid())
# use shared ressource
...
lock.release(os.getpid())
这按预期工作,但对于一项相对简单的任务来说似乎是一项相当大的努力。 所以我想知道是否有更简单的方法可以做到这一点?
【问题讨论】:
-
如果您可以将 body 转换为函数,我创建了一个可以帮助您的装饰器,请参阅 here
标签: python asynchronous multiprocessing synchronization shared-resource