Add shared file lock and concurrency test

This commit is contained in:
thePR0M3TH3AN
2025-06-29 22:58:43 -04:00
parent 21c2599b39
commit a2a3236248
3 changed files with 66 additions and 1 deletions

View File

@@ -22,3 +22,25 @@ def exclusive_lock(
lock = portalocker.Lock(str(path), mode="a+b", timeout=timeout)
with lock as fh:
yield fh
@contextmanager
def shared_lock(
path: Path, timeout: Optional[float] = None
) -> Generator[None, None, None]:
"""Context manager that locks *path* with a shared lock.
The function opens the file in binary read/write mode and obtains a
shared lock using ``portalocker``. If ``timeout`` is provided, acquiring
the lock will wait for at most that many seconds before raising
``portalocker.exceptions.LockException``.
"""
path = Path(path)
path.parent.mkdir(parents=True, exist_ok=True)
path.touch(exist_ok=True)
lock = portalocker.Lock(
str(path), mode="r+b", timeout=timeout, flags=portalocker.LockFlags.SHARED
)
with lock as fh:
fh.seek(0)
yield fh