aioredis_lock
Implementation of distributed locking with aioredis, an asyncio based redis client.
This is a standalone lib until, and if, aio-libs/aioredis#573 is accepted.
Usage
You need an aioredis.RedisConnection or aioredis.ConnectionsPool already created.
Mutex
from aioredis_lock import RedisLock, LockTimeoutError
try:
async with RedisLock(
pool,
key="foobar",
# how long until the lock should expire (seconds). this can be extended
# via `await lock.extend(30)`
timeout=30,
# you can customize how long to allow the lock acquisitions to be
# attempted.
wait_timeout=30,
) as lock:
# If you get here, you now have a lock and are the only program that
# should be running this code at this moment.
# do some work...
# we may want it longer...
await lock.extend(30)
except LockTimeoutError:
# The lock could not be acquired by this worker and we should give up
pass
Simple Leader/Follower(s)
Let's suppose you need a simple leader/follower type implementation where you have a number of web-workers but just want 1 to preform a repeated task. In the case the leader fails someone else should pick up the work. Simply pass wait_timeout=None to RedisLock allowing the worker to keep trying to get a lock for when the leader eventually fails. The main complication here is extending the lock and validating the leader still owns it.
from aioredis_lock import RedisLock
# if the lock is lost, we still want to be a follower
while True:
# wait indefinitely to acquire a lock
async with RedisLock(pool, "shared_key", wait_timeout=None) as lock:
# hold the lock as long as possible
while True:
if not await lock.is_owner():
logger.debug("We are no longer the lock owner, falling back")
break
# do some work
if not await lock.renew():
logger.debug("We lost the lock, falling back to follower mode")
break
This mostly delegates the work of selecting and more importantly promoting leaders.
Metadata
Release files for aioredis-lock 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| aioredis-lock-0.1.0.tar.gz | 4.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| aioredis_lock-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 10.8 kB
Release files / aioredis-lock-0.1.0.tar.gz
| Download URL | aioredis-lock-0.1.0.tar.gz |
|---|---|
| Size | 4.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dd62f980c57bff8c8e66a0d1947c95060dbb9f5f465156fb705e3b47547ae834
|
|
BLAKE2b-256 checksum How to use checksums |
f8c8adc60ac0a6c3eebff408b7f684bc024e0bd32d2b18b76e0672c571be252b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.2 CPython/3.7.5
|
Release files / aioredis_lock-0.1.0-py3-none-any.whl
| Download URL | aioredis_lock-0.1.0-py3-none-any.whl |
|---|---|
| Size | 6.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0d0cda38f75609ba20ed6d34deef8a3594847e00c71d61774a76d0dbe428f551
|
|
BLAKE2b-256 checksum How to use checksums |
2bbf096e6a897d38feda71dd9aa33f9855b8bfa1dd7b84c599b3547fc6e60143
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.40.2 CPython/3.7.5
|