redis锁定:redispy与python-redis-lock

时间:2018-09-12 12:52:36

标签: python redis redis-py

除了python-redis-lock模块为锁对象提供了contextmanager -与从redispy模块获得的锁对象相比,有什么区别? python-redis-lock有什么特别之处?

rc = Redis.from_url(settings.BROKER_URL)
lock_str = "bld-%s-lock" % bld_id

使用redispy:

lock = rc.lock(lock_str)

使用python-redis-lock:

lock = redis_lock.Lock(rc, lock_str)

1 个答案:

答案 0 :(得分:3)

我认为上下文管理器不是这里的主要区别,因为如果您看到redis-py Lock的代码,则在其中添加了__enter____exit__

两个锁似乎都使用SETNX来获取锁:

我看到的主要区别是阻塞线程的工作方式。

  • 在使用 python-redis-lock 的情况下,他们一直在使用BLPOP机制来阻塞线程,在我看来,这似乎是使用redis自己版本的阻塞机制。 Github code
  

类似的东西:

     

timed_out = not self._client.blpop(self._signal, blpop_timeout) and timeout

  • 对于 redis-py ,他们似乎使用time module及其sleep方法来阻塞线程,以检查阻塞是否超时。
  

类似的东西:

import time as mod_time

...
stop_trying_at = mod_time.time() + blocking_timeout
...
mod_time.sleep(sleep)