The simplest use is by using it as a context manager:
with NonBlockingLock.objects.acquire_lock(obj=model_obj): model_obj.do_something()
Or you can keep track of the lock yourself:
try: lock = NonBlockingLock.objects.acquire_lock(obj=model_obj) except AlreadyLocked: return False model_obj.do_something() lock.release()
If you have no Django model, or you want to be able to specify the lock name yourself, you can do that too:
# this will raise AlreadyLocked, if it's locked lock = NonBlockingLock.objects.acquire_lock(lock_name='my_lock') do_something() lock.release()
Note that locks can expire automatically. There is a LOCK_MAX_AGE settings where you can specify a default lock release value for locks in your entire Django codebase. This value can be overridden per lock by setting the max_age parameter.
You can run the tests with
tox
- v2.0.0:
- Merging of master and pre-django-1.8 branches Removes management command in favor of a celery task
- v1.2.1:
- Fix problem in migration to UUIDField for PostGres
- v1.2.0:
- Move id to UUIDField, add code quality checks and CI
- v1.1.0:
- Rename model to NonBlockingLock and add additional features
- v1.0.1:
- Corrected tests and code clean-up
- v1.0.0:
- Intial release.