Source code for rodario.util
""" Utility module for rodario framework """
# stdlib
from time import time
# local
from rodario import get_redis_connection
[docs]def acquire_lock(name, expiry=None, context=None, conn=None):
"""
Acquire a lock in redis.
:param str name: Name of the lock to acquire
:param int expiry: The duration of the lock (in seconds)
:param str context: The context to apply to the lock name
:param redis.Connection conn: The redis connection to use
:rtype: :class:`bool`
:returns: Whether or not the lock was acquired
"""
# pylint: disable=W0212
current = time()
lock_expiry = 3 if expiry is None else expiry
lock_expires = current + lock_expiry
lock_context = 'global.lock' if context is None else context
lock_name = '%s:%s' % (lock_context, name)
redis = get_redis_connection() if conn is None else conn
# try to get lock; if we fail, do sanity check on lock
if not redis.setnx(lock_name, lock_expires):
# see if current lock is expired; if so, take it
if (current < float(redis.get(lock_name))
or current < float(redis.getset(lock_name, lock_expires))):
# lock is not expired or somebody else beat us to it
return False
# we have the lock; give it a TTL and pass through
redis.expire(lock_name, lock_expiry)
return True