zoukankan      html  css  js  c++  java
  • Redis分布式锁的python实现

    #!/usr/bin/env python
    # coding=utf-8
     
    import time
    import redis
     
    class RedisLock(object):
        def __init__(self, key):
            self.rdcon = redis.Redis(host='', port=6379, password="", 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() > cls.rdcon.get(cls.lock_key) and time.time() > cls.rdcon.getset(cls.lock_key, timestamp)):
                    print "get lock"
                    break
                else:
                    time.sleep(0.3)
     
        @staticmethod
        def release(cls):
            if time.time() < 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("112233"))
    def myfunc():
        print "myfunc() called."
        time.sleep(20)
     
     
    if __name__ == "__main__":
        myfunc()

    案例二:

    import redis
    import time, datetime
    
    
    def acquire_lock(conn, lockname, identifier, expire=10):
        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(conn, lockname, identifier):
        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
    
    
    conn = redis.Redis(host='localhost', port=6379, db=0)
    
    # 1 identifier
    # 2 False
    # 11 True
    # 22 False
    # 33 barx2
    # 44 True
    
    ret = acquire_lock(conn, "lockname", "identifier", 3)
    print "1", ret
    ret = acquire_lock(conn, "lockname", "identifier", 3)
    print "2", ret
    ret = release_lock(conn, "lockname", "identifier")
    print "11", ret
    ret = release_lock(conn, "lockname", "identifier")
    print "22", ret
    
    ret = acquire_lock(conn, "footest", "bartest", 10)
    print "33", ret
  • 相关阅读:
    程序员,如何从平庸走向理想?
    【Hadoop】HA 场景下访问 HDFS JAVA API Client
    hive 和Hbase的pom文件
    wxpython多线程通信的应用-实现边录音边绘制音谱图
    wxpython多线程间通信
    LeetCode 92. ReverseLinkedII
    pip换源安装
    wxpython绘制音频
    python读取wav文件并播放[pyaudio/wave]
    Python绘制wav文件音频图(静态)[matplotlib/wave]
  • 原文地址:https://www.cnblogs.com/chengege/p/11074055.html
Copyright © 2011-2022 走看看