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)
除了 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)