dongzhaorui пре 3 година
родитељ
комит
96e8a4898b
1 измењених фајлова са 53 додато и 0 уклоњено
  1. 53 0
      find_source/common/bloom_filter/utils.py

+ 53 - 0
find_source/common/bloom_filter/utils.py

@@ -0,0 +1,53 @@
+# -*- coding: utf-8 -*-
+# @Time    : 2019/9/30 22:03
+# @Author  : CRJ
+# @File    : utils.py
+# @Software: PyCharm
+# @Python3.6
+import uuid
+import math
+import time
+import redis
+
+
+# 获取锁
+def acquire_lock_with_timeout(conn, lockname, acquire_timeout=5, lock_timeout=10):
+    # 128位随机标识符
+    identifier = str(uuid.uuid4())
+    lockname = 'lock:' + lockname
+    lock_timeout = int(math.ceil(lock_timeout))  # 确保传给exprie是整数
+
+    end = time.time() + acquire_timeout
+    while time.time() < end:
+        if conn.setnx(lockname, identifier):
+            conn.expire(lockname, lock_timeout)
+            return identifier
+        elif not conn.ttl(lockname):  # 为没有设置超时时间的锁设置超时时间
+            conn.expire(lockname, lock_timeout)
+
+        time.sleep(0.001)
+    return False
+
+
+# 释放锁
+def release_lock(conn, lockname, identifier):
+    pipe = conn.pipeline(True)
+    lockname = 'lock:' + lockname
+
+    while True:
+        try:
+            pipe.watch(lockname)
+            # 判断标志是否相同
+            if str(pipe.get(lockname), encoding='utf-8') == identifier:
+                pipe.multi()
+                pipe.delete(lockname)
+                pipe.execute()
+                return True
+
+            # 不同则直接退出 return False
+            pipe.unwatch()
+            break
+
+        except redis.exceptions.WatchError:
+            pass
+    return False