A python implementation of the three Reader-Writer problems.
Project Links
Meta
Author: Éric Larivière
Maintainer: Éric Larivière
Requires Python: >=3.6
Classifiers
Development Status
- 5 - Production/Stable
Intended Audience
- Developers
License
- OSI Approved :: MIT License
Programming Language
- Python :: 3.7
- Python :: 3.8
- Python :: 3.9
Reader Writer Lock
A python implementation of a solution for the three Reader-Writer problems.
Not only does it implement the reader-writer problems, it is also compliant with the python lock interface which among others include support for timeout.
For reading about the theory behind the reader-writer problems refer to Wikipedia.
Installation
Install the python package readerwriterlock
python3 -m pip install -U readerwriterlock
Usage
- Choose a rwlock class base on your access priority need and feature need which is going to be use by the threads:
| Priority | +Speed | +Downgradable* |
|---|---|---|
| Reader priority (aka First readers-writers problem) | RWLockRead | RWLockReadD |
| Writer priority (aka Second readers-writers problem) | RWLockWrite | RWLockWriteD |
| Fair priority (aka Third readers-writers problem) | RWLockFair | RWLockFairD |
* Downgradable feature allows the locks to be atomically downgraded from being locked in write-mode to locked in read-mode
ⓘ Downgradable classes come with a theoretical ~20% negative effect on performance for acquiring and releasing locks.
- Instantiate an instance of the chosen RWLock class:
from readerwriterlock import rwlock
a = rwlock.RWLockFairD()
- Generate read locks and write locks using the following methods:
a_reader_lock = a.gen_rlock()
a_writer_lock = a.gen_wlock()
- Use the generated read/write locks to protect section in your code:
Pythonic usage example
with a.gen_rlock():
#Read stuff
with a.gen_wlock():
#Write stuff
Use case (Timeout) example
b = a.gen_wlock()
if b.acquire(blocking=True, timeout=5):
try:
#Do stuff
finally:
b.release()
Use case (Downgrade) example
b = a.gen_wlock()
if b.acquire():
try:
#Read/Write stuff
b = b.downgrade()
#Read stuff
finally:
b.release()
Live example
Refer to the file test_rwlock.py which has above 90% line coverage of rwlock.py.
The tests can be initiated by doing
make check.test.coverage
Contact
- Project: GitHub
- Éric Larivière ericlariviere@hotmail.com
1.0.9
Sep 06, 2021
1.0.8
Jan 28, 2021
1.0.7
Apr 26, 2020
1.0.6
Jan 14, 2020
1.0.5
Jan 14, 2020
1.0.4
Jun 30, 2019
1.0.3
Feb 13, 2019
1.0.2
Sep 28, 2018
1.0.1
Apr 01, 2018
1.0.0
Mar 31, 2018
Wheel compatibility matrix
Files in release
Extras:
None
Dependencies:
typing-extensions