|
@@ -4,14 +4,14 @@
|
|
# @File : utils.py
|
|
# @File : utils.py
|
|
# @Software: PyCharm
|
|
# @Software: PyCharm
|
|
# @Python3.6
|
|
# @Python3.6
|
|
-import io
|
|
|
|
-import uuid
|
|
|
|
import math
|
|
import math
|
|
import time
|
|
import time
|
|
|
|
+import uuid
|
|
|
|
+
|
|
import redis
|
|
import redis
|
|
|
|
|
|
|
|
|
|
-# 获取锁
|
|
|
|
|
|
+# 获取锁(乐观锁)
|
|
def acquire_lock_with_timeout(conn, lockname, acquire_timeout=5, lock_timeout=10):
|
|
def acquire_lock_with_timeout(conn, lockname, acquire_timeout=5, lock_timeout=10):
|
|
# 128位随机标识符
|
|
# 128位随机标识符
|
|
identifier = str(uuid.uuid4())
|
|
identifier = str(uuid.uuid4())
|
|
@@ -30,28 +30,28 @@ def acquire_lock_with_timeout(conn, lockname, acquire_timeout=5, lock_timeout=10
|
|
return False
|
|
return False
|
|
|
|
|
|
|
|
|
|
-# 释放锁
|
|
|
|
|
|
+# 释放锁(乐观锁)
|
|
def release_lock(conn, lockname, identifier):
|
|
def release_lock(conn, lockname, identifier):
|
|
- pipe = conn.pipeline(True)
|
|
|
|
lockname = 'lock:' + lockname
|
|
lockname = 'lock:' + lockname
|
|
- while True:
|
|
|
|
- # try:
|
|
|
|
- pipe.watch(lockname)
|
|
|
|
- value = pipe.get(lockname)
|
|
|
|
- # 判断标志是否相同
|
|
|
|
- if value is not None and value.decode() == identifier:
|
|
|
|
- pipe.multi()
|
|
|
|
- pipe.delete(lockname)
|
|
|
|
- pipe.execute()
|
|
|
|
- return True
|
|
|
|
-
|
|
|
|
- # 不同则直接退出 return False
|
|
|
|
- pipe.unwatch()
|
|
|
|
- break
|
|
|
|
-
|
|
|
|
- # except (redis.exceptions.WatchError, TypeError):
|
|
|
|
- # pass
|
|
|
|
- return False
|
|
|
|
|
|
+ with conn.pipeline(True) as pipe:
|
|
|
|
+ while True:
|
|
|
|
+ try:
|
|
|
|
+ pipe.watch(lockname)
|
|
|
|
+ value = pipe.get(lockname)
|
|
|
|
+ # 判断标志是否相同
|
|
|
|
+ if value is not None and value.decode() == identifier:
|
|
|
|
+ pipe.multi()
|
|
|
|
+ pipe.delete(lockname)
|
|
|
|
+ pipe.execute()
|
|
|
|
+ return True
|
|
|
|
+
|
|
|
|
+ # 不同则直接退出 return False
|
|
|
|
+ pipe.unwatch()
|
|
|
|
+ break
|
|
|
|
+ except redis.exceptions.WatchError:
|
|
|
|
+ pass
|
|
|
|
+
|
|
|
|
+ return False
|
|
|
|
|
|
|
|
|
|
# if __name__ == '__main__':
|
|
# if __name__ == '__main__':
|