A flexible low-level tool to make synchronisation primitives in asyncio Python
Project description
fifolock
A flexible low-level tool to make synchronisation primitives in asyncio Python. As the name suggests, locks are granted strictly in the order requested: first-in-first-out; and are not reentrant.
Installation
pip install fifolock
Recipes
Mutex (exclusive) lock
import asyncio
from fifolock import FifoLock
class Mutex(asyncio.Future):
@staticmethod
def is_compatible(holds):
return not holds[Mutex]
lock = FifoLock()
async def access():
async with lock(Mutex):
# access resource
Read/write (shared/exclusive) lock
import asyncio
from fifolock import FifoLock
class Read(asyncio.Future):
@staticmethod
def is_compatible(holds):
return not holds[Write]
class Write(asyncio.Future):
@staticmethod
def is_compatible(holds):
return not holds[Read] and not holds[Write]
lock = FifoLock()
async def read():
async with lock(Read):
# shared access
async def write():
async with lock(Write):
# exclusive access
Semaphore
import asyncio
from fifolock import FifoLock
class SemaphoreBase(asyncio.Future):
@classmethod
def is_compatible(cls, holds):
return holds[cls] < cls.size
lock = FifoLock()
Semaphore = type('Semaphore', (SemaphoreBase, ), {'size': 3})
async def access():
async with lock(Semaphore):
# at most 3 concurrent accesses
Running tests
python setup.py test
Design choices
Each mode of the lock is a subclass of asyncio.Future
. This could be seen as a leak some of the internals of FifoLock
, but it allows for clear client and internal code.
-
Classes are hashable, so each can be a key in the
holds
dictionary passed to theis_compatible
method. This allows the compatibility conditions to be read clearly in the client code, and theholds
dictionary to be mutated clearly internally. -
An instance of it, created inside
FifoLock
, is both the object awaited upon, and stored in a deque with a way of accessing itsis_compatible
method. -
The fact it's a class and not an instance of a class also makes clear it is to store no state, merely configuration.
A downside is that for configurable modes, such as for a semaphore, the client must dynamically create a class: this is not a frequently-used pattern.
The fact that the lock is not reentrant is deliberate: the class of algorithms this is designed for does not require this. This would add unnecessary complexity, and presumably be slower.
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
File details
Details for the file fifolock-0.0.17.tar.gz
.
File metadata
- Download URL: fifolock-0.0.17.tar.gz
- Upload date:
- Size: 2.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.20.0 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.6.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 430077737348eed6f0a4af02d5b5cba876443a620c99a052c5384e523cca86f4 |
|
MD5 | 82675154c0937503729276ed1663c99f |
|
BLAKE2b-256 | c265685186334e6b25dad8d727f7ae6149141a1c30a55c3eb4913349ac1e4339 |
File details
Details for the file fifolock-0.0.17-py3-none-any.whl
.
File metadata
- Download URL: fifolock-0.0.17-py3-none-any.whl
- Upload date:
- Size: 3.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.20.0 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.6.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2d976b830467f6ab2ed36749b2140a2715b3ba19fbc5c16fd31744b023c08983 |
|
MD5 | 2e2d4a3ba0a962617dadeb02307bc965 |
|
BLAKE2b-256 | 4365a9a74c428c283f2a5f98f038837a2b7b0e1b8fc1e94e6f4a72f9f6c8fa0b |