redis锁定:redispy vs python-redis-lock

Mur*_*uru 8 python redis redis-py

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

rc = Redis.from_url(settings.BROKER_URL)
lock_str = "bld-%s-lock" % bld_id
Run Code Online (Sandbox Code Playgroud)

使用redispy:

lock = rc.lock(lock_str)
Run Code Online (Sandbox Code Playgroud)

使用python-redis-lock:

lock = redis_lock.Lock(rc, lock_str)
Run Code Online (Sandbox Code Playgroud)

Nag*_*tri 5

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

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

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

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

就像是:

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

  • redis-py的情况下,它们似乎使用时间模块及其休眠方法来阻塞线程,以检查阻塞是否超时。

就像是:

import time as mod_time

...
stop_trying_at = mod_time.time() + blocking_timeout
...
mod_time.sleep(sleep)
Run Code Online (Sandbox Code Playgroud)