- python 的 enter 和 exit 魔术方法实现上下文管理。
- 调用with后,enter()方法会被调用,返回值会赋值给as后面的变量。当with里的代码块被执行完或者异常退出后,将调用返回对象的__exit__()方法。
class RedisLock(object):
"""redis dist lock
@param name 锁名称
@param client redis连接
@param timeout 超过多少s锁不释放,则自动过期
@param retries 重试次数
"""
def __init__(self, name, client, timeout=5, retries=0):
self.key = "distributed-redis-lock:%s" % name
self.client = client
self.timeout = timeout
self.retries = retries
self.has_lock = False
def __enter__(self):
while True:
is_ok = self.client.set(self.key, 1, ex=self.timeout, nx=True)
if is_ok:
self.has_lock = True
return self
if self.retries == 0:
break
self.retries -= 1
time.sleep(0.1)
return self
def __exit__(self, exc_type, exc_val, exc_tb):
# 拥有锁才删除锁
if self.has_lock:
self.client.delete(self.key)
- 应用场景:
1.唯一性记录添加加锁。
2.进行唯一性操作的时候加锁。