%global _empty_manifest_terminate_build 0 Name: python-aioredis-lock Version: 0.1.0 Release: 1 Summary: Wrapper to provide distributed locks in aioredis License: MIT License URL: https://github.com/mrasband/aioredis-lock Source0: https://mirrors.nju.edu.cn/pypi/web/packages/f8/c8/adc60ac0a6c3eebff408b7f684bc024e0bd32d2b18b76e0672c571be252b/aioredis-lock-0.1.0.tar.gz BuildArch: noarch Requires: python3-aioredis %description # aioredis_lock [![CircleCI](https://circleci.com/gh/mrasband/aioredis-lock.svg?style=svg)](https://circleci.com/gh/mrasband/aioredis-lock) Implementation of distributed locking with [aioredis](https://github.com/aio-libs/aioredis), an asyncio based redis client. This is a standalone lib until, and if, [aio-libs/aioredis#573](https://github.com/aio-libs/aioredis/pull/573) is accepted. ## Usage You need an `aioredis.RedisConnection` or `aioredis.ConnectionsPool` already created. ### Mutex ```python 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. ```python 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. %package -n python3-aioredis-lock Summary: Wrapper to provide distributed locks in aioredis Provides: python-aioredis-lock BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-pip %description -n python3-aioredis-lock # aioredis_lock [![CircleCI](https://circleci.com/gh/mrasband/aioredis-lock.svg?style=svg)](https://circleci.com/gh/mrasband/aioredis-lock) Implementation of distributed locking with [aioredis](https://github.com/aio-libs/aioredis), an asyncio based redis client. This is a standalone lib until, and if, [aio-libs/aioredis#573](https://github.com/aio-libs/aioredis/pull/573) is accepted. ## Usage You need an `aioredis.RedisConnection` or `aioredis.ConnectionsPool` already created. ### Mutex ```python 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. ```python 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. %package help Summary: Development documents and examples for aioredis-lock Provides: python3-aioredis-lock-doc %description help # aioredis_lock [![CircleCI](https://circleci.com/gh/mrasband/aioredis-lock.svg?style=svg)](https://circleci.com/gh/mrasband/aioredis-lock) Implementation of distributed locking with [aioredis](https://github.com/aio-libs/aioredis), an asyncio based redis client. This is a standalone lib until, and if, [aio-libs/aioredis#573](https://github.com/aio-libs/aioredis/pull/573) is accepted. ## Usage You need an `aioredis.RedisConnection` or `aioredis.ConnectionsPool` already created. ### Mutex ```python 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. ```python 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. %prep %autosetup -n aioredis-lock-0.1.0 %build %py3_build %install %py3_install install -d -m755 %{buildroot}/%{_pkgdocdir} if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi pushd %{buildroot} if [ -d usr/lib ]; then find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/lib64 ]; then find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/bin ]; then find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/sbin ]; then find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst fi touch doclist.lst if [ -d usr/share/man ]; then find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst fi popd mv %{buildroot}/filelist.lst . mv %{buildroot}/doclist.lst . %files -n python3-aioredis-lock -f filelist.lst %dir %{python3_sitelib}/* %files help -f doclist.lst %{_docdir}/* %changelog * Wed May 10 2023 Python_Bot - 0.1.0-1 - Package Spec generated