summaryrefslogtreecommitdiff
path: root/redis/lock.py
diff options
context:
space:
mode:
authorColas Le Guernic <clslgrnc@users.noreply.github.com>2020-01-23 21:52:17 +0100
committerAndy McCurdy <andy@andymccurdy.com>2020-02-24 11:38:29 -0800
commit03260002ded57223c5d05b2c99a0a710ee5d34f3 (patch)
tree7782577a7df3f57eac29b047a8b90e2ce63b14dd /redis/lock.py
parentfc88507aef921450dd95ada7181f1c316e01ee8b (diff)
downloadredis-py-03260002ded57223c5d05b2c99a0a710ee5d34f3.tar.gz
Optimize sleeping while blocking for a lock
When waiting to acquire a lock, the Lock object will sleep until the lock is acquired or until blocking_timeout has elapsed. This optimization calculates whether the next iteration will occur after blocking_timeout has elapsed and short circuits it immediately. Fixes #1263
Diffstat (limited to 'redis/lock.py')
-rw-r--r--redis/lock.py5
1 files changed, 2 insertions, 3 deletions
diff --git a/redis/lock.py b/redis/lock.py
index 8d481d7..2f5aa27 100644
--- a/redis/lock.py
+++ b/redis/lock.py
@@ -124,8 +124,6 @@ class Lock(object):
self.thread_local = bool(thread_local)
self.local = threading.local() if self.thread_local else dummy()
self.local.token = None
- if self.timeout and self.sleep > self.timeout:
- raise LockError("'sleep' must be less than 'timeout'")
self.register_scripts()
def register_scripts(self):
@@ -184,7 +182,8 @@ class Lock(object):
return True
if not blocking:
return False
- if stop_trying_at is not None and mod_time.time() > stop_trying_at:
+ next_try_at = mod_time.time() + sleep
+ if stop_trying_at is not None and next_try_at > stop_trying_at:
return False
mod_time.sleep(sleep)