Wraps the portalocker recipe for easy usage
Project description
Overview
Portalocker is a library to provide an easy API to file locking.
An important detail to note is that on Linux and Unix systems the locks are advisory by default. By specifying the -o mand option to the mount command it is possible to enable mandatory file locking on Linux. This is generally not recommended however. For more information about the subject:
The module is currently maintained by Rick van Hattem <Wolph@wol.ph>. The project resides at https://github.com/WoLpH/portalocker . Bugs and feature requests can be submitted there. Patches are also very welcome.
Tips
On some networked filesystems it might be needed to force a os.fsync() before closing the file so it’s actually written before another client reads the file. Effectively this comes down to:
with portalocker.Lock('some_file', 'rb+', timeout=60) as fh: # do what you need to do ... # flush and sync to filesystem fh.flush() os.fsync(fh.fileno())
Links
- Documentation
- Bug reports
- Package homepage
- My blog
Examples
To make sure your cache generation scripts don’t race, use the Lock class:
>>> import portalocker >>> with portalocker.Lock('somefile', timeout=1) as fh: ... print >>fh, 'writing some stuff to my cache...'
To customize the opening and locking a manual approach is also possible:
>>> import portalocker >>> file = open('somefile', 'r+') >>> portalocker.lock(file, portalocker.LOCK_EX) >>> file.seek(12) >>> file.write('foo') >>> file.close()
Explicitly unlocking is not needed in most cases but omitting it has been known to cause issues: https://github.com/AzureAD/microsoft-authentication-extensions-for-python/issues/42#issuecomment-601108266
If needed, it can be done through:
>>> portalocker.unlock(file)
Do note that your data might still be in a buffer so it is possible that your data is not available until you flush() or close().
To create a cross platform bounded semaphore across multiple processes you can use the BoundedSemaphore class which functions somewhat similar to threading.BoundedSemaphore:
>>> import portalocker >>> n = 2 >>> timeout = 0.1
>>> semaphore_a = portalocker.BoundedSemaphore(n, timeout=timeout) >>> semaphore_b = portalocker.BoundedSemaphore(n, timeout=timeout) >>> semaphore_c = portalocker.BoundedSemaphore(n, timeout=timeout)
>>> semaphore_a.acquire() <portalocker.utils.Lock object at ...> >>> semaphore_b.acquire() <portalocker.utils.Lock object at ...> >>> semaphore_c.acquire() Traceback (most recent call last): ... portalocker.exceptions.AlreadyLocked
More examples can be found in the tests.
Changelog
See the changelog page.
License
See the LICENSE file.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for portalocker-2.0.0-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5d7bc386d785dfc87e763a29d7d5864556c62653379e3ff484c71e49425d1898 |
|
MD5 | e9cb92b2386ff67ee54862e88251930e |
|
BLAKE2b-256 | 89a63814b7107e0788040870e8825eebf214d72166adf656ba7d4bf14759a06a |