diff options
author | CoprDistGit <infra@openeuler.org> | 2023-05-10 09:32:35 +0000 |
---|---|---|
committer | CoprDistGit <infra@openeuler.org> | 2023-05-10 09:32:35 +0000 |
commit | 9d602190c9f0a3d23e889a977b02d6809103833c (patch) | |
tree | a93aeaf223451ecbbf9446008f70053e0051ae21 /python-aioredis-lock.spec | |
parent | 98c8c8f0580b45471ad2225b562de1a17e5b2372 (diff) |
automatic import of python-aioredis-lock
Diffstat (limited to 'python-aioredis-lock.spec')
-rw-r--r-- | python-aioredis-lock.spec | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/python-aioredis-lock.spec b/python-aioredis-lock.spec new file mode 100644 index 0000000..8963d29 --- /dev/null +++ b/python-aioredis-lock.spec @@ -0,0 +1,283 @@ +%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 + +[](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 + +[](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 + +[](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 <Python_Bot@openeuler.org> - 0.1.0-1 +- Package Spec generated |