redis 锁定:redispy 与 python-redis-lock

redis locking: redispy vs python-redis-lock

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

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

使用重新分发:

lock = rc.lock(lock_str)

使用python-redis-lock:

lock = redis_lock.Lock(rc, lock_str)

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

Lock 似乎都使用 SETNX 获取锁:

我看到的主要区别在于阻止线程工作的方式。

  • python-redis-lock 的情况下,他们一直在使用 BLPOP mechanism to block the thread, which to me seems like using redis's own version of blocking mechanism. Github code

Something like:

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

  • redis-py 的情况下,他们似乎使用 time module and its sleep 方法来阻塞线程以检查阻塞是否超时。

Something like:

import time as mod_time

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