程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python實現redis分布式鎖,支持注解,開箱即用,無BUG

編輯:Python

這是我2019年開發的,已經在很多項目中實踐認證,很好用


import time
import redis
"""
基於Redis實現的分布式悲觀鎖
@site http://itsub.cn
@author 夏增明
"""
class RedisLock():
def __init__(self, ):
self.conn = redis.Redis(host='', port=6379, password="", db=1)
def acquire_lock(self, lockname, identifier='ok', expire=10):
conn = self.conn
if conn.setnx(lockname, identifier):
conn.expire(lockname, expire)
return identifier
elif not conn.ttl(lockname):
conn.expire(lockname, expire)
return False
def release_lock(self, lockname, identifier='ok'):
conn = self.conn
pipe = conn.pipeline(True)
while True:
try:
pipe.watch(lockname)
if pipe.get(lockname) == identifier:
pipe.multi()
pipe.delete(lockname)
pipe.execute()
return True
pipe.unwatch()
break
except redis.exceptions.WatchError:
pass
# we lost the lock
return False
def lock(lockname,expire=10):
lock = RedisLock()
def _deco(func):
def __deco(*args, **kwargs):
#print( "before %s called [%s]." % (func.__name__, lock) )
lock.acquire_lock(lockname,expire=expire)
try:
return func(*args, **kwargs)
finally:
lock.release_lock(lockname)
return __deco
return _deco
#通過鎖名字進行排隊同步
@lock('test')
def hello():
print("hello() called.")
time.sleep(20)
if __name__ == "__main__":
hello()

好東西不私藏,點贊關注呗


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved