1: redis 锁 作为一种术装饰器使用

  基本逻辑:

    1:声明一个redislock类  定义生成锁和释放锁两个方法

    2:生成锁使用了一个默认值 setnx ; 如果当前时间大于 第一次锁的生成时间就重新生成(循环一次锁的时间更新一次)

    3:释放锁:在设置的时间范围timeout 内 , 就释放锁

    3:定义一个装饰器方法 参数是redis锁对象(写法值得借鉴)

  

import time
import redis class RedisLock(object):
def __init__(self, key):
self.rdcon = redis.Redis(host='localhost', port=6379, db=1)
self._lock = 0
self.lock_key = "%s_dynamic_test" % key @staticmethod
def get_lock(cls, timeout=10):
while cls._lock != 1:
timestamp = time.time() + timeout + 1
cls._lock = cls.rdcon.setnx(cls.lock_key, timestamp) if cls._lock == 1 or (
time.time() > float(cls.rdcon.get(cls.lock_key)) and time.time() > float(cls.rdcon.getset(cls.lock_key,
timestamp))):
print("get lock")
break
else:
time.sleep(0.3) @staticmethod
def release(cls):
print('*'*10)
print(time.time())
print(cls.rdcon.get(cls.lock_key))
if time.time() < float(cls.rdcon.get(cls.lock_key)):
print("release lock") cls.rdcon.delete(cls.lock_key) def deco(cls):
def _deco(func):
def __deco(*args, **kwargs):
print("before %s called [%s]." % (func.__name__, cls))
cls.get_lock(cls)
try:
return func(*args, **kwargs)
finally:
cls.release(cls) return __deco return _deco @deco(RedisLock(""))
def myfunc():
print("myfunc() called.")
time.sleep(5)
print('end..') if __name__ == "__main__":
myfunc()

最新文章

  1. JavaScript中的 offset, client,scroll
  2. C#获得网卡信息 NetworkInterface IPInterfaceProperties
  3. eclipse编辑器配置
  4. java中的static使用--静态变量、静态方法
  5. js中获取键盘事件【转】
  6. JSP之错误信息提示
  7. js笔记——浏览器及版本判断
  8. 2014华为机试西安地区B组试题
  9. JavaEE(2) - Weblogic 服务器执行JNDI绑定和查找
  10. 让你用 Chrome 上网快到想哭:Vimium
  11. [转] JavaScript中in操作符(for..in)、Object.keys()和Object.getOwnPropertyNames()的区别
  12. Ubuntu 下使用 Nginx 部署 .NET Core 2.0 网站
  13. 什么是LDAP?
  14. FAIR开源Detectron:整合全部顶尖目标检测算法
  15. AspectJ 切面注解中五种通知注解:@Before、@After、@AfterRunning、@AfterThrowing、@Around
  16. ux.form.field.Year 只能选年的时间扩展
  17. mybatis foreach 遍历list中的坑
  18. 自然语言处理--jieba和gensim的分词功能
  19. 【PMP】三点估算法
  20. 浅谈C#中的深拷贝(DeepCopy)与浅拷贝(MemberwiseClone)

热门文章

  1. day 26作业
  2. Node: 包管理机制
  3. C:\Program Files\Docker\Docker\Resources\bin\docker.exe: no matching manifest for windows/amd64 10.0.17763 in the manifest list entries.
  4. 什么影响了mysql的性能-存储引擎层
  5. 剖析和解决Python中网络粘包的正确姿势
  6. 11.vue-router编程式导航
  7. python中的object
  8. mysql udf提权
  9. H5页面中判断是安卓手机还是ios手机的方法;APP页面中嵌套的H5跳转到APP其他页面的方法。
  10. ArrayList 集合 简单运用