コード例 #1
0
ファイル: lock.py プロジェクト: xeooon/jumpserver
    def __init__(self,
                 name,
                 *,
                 expire=None,
                 release_on_transaction_commit=False,
                 reentrant=False,
                 release_raise_exc=False,
                 auto_renewal_seconds=60):
        """
        使用 redis 构造的分布式锁

        :param name:
            锁的名字,要全局唯一
        :param expire:
            锁的过期时间
        :param release_on_transaction_commit:
            是否在当前事务结束后再释放锁
        :param release_raise_exc:
            释放锁时,如果没有持有锁是否抛异常或静默
        :param auto_renewal_seconds:
            当持有一个无限期锁的时候,刷新锁的时间,具体参考 `redis_lock.Lock#auto_renewal`
        :param reentrant:
            是否可重入
        """
        self.kwargs_copy = copy_function_args(self.__init__, locals())
        redis = Redis(host=CONFIG.REDIS_HOST,
                      port=CONFIG.REDIS_PORT,
                      password=CONFIG.REDIS_PASSWORD)

        if expire is None:
            expire = auto_renewal_seconds
            auto_renewal = True
        else:
            auto_renewal = False

        super().__init__(redis_client=redis,
                         name='{' + name + '}',
                         expire=expire,
                         auto_renewal=auto_renewal)
        self.register_scripts(redis)
        self._release_on_transaction_commit = release_on_transaction_commit
        self._release_raise_exc = release_raise_exc
        self._reentrant = reentrant
        self._acquired_reentrant_lock = False
        self._thread_id = threading.current_thread().ident
コード例 #2
0
    def __init__(self, name, blocking=True, expire=60 * 2, auto_renewal=True):
        """
        使用 redis 构造的分布式锁

        :param name:
            锁的名字,要全局唯一
        :param blocking:
            该参数只在锁作为装饰器或者 `with` 时有效。
        :param expire:
            锁的过期时间,注意不一定是锁到这个时间就释放了,分两种情况
            当 `auto_renewal=False` 时,锁会释放
            当 `auto_renewal=True` 时,如果过期之前程序还没释放锁,我们会延长锁的存活时间。
            这里的作用是防止程序意外终止没有释放锁,导致死锁。
        """
        self.kwargs_copy = copy_function_args(self.__init__, locals())
        redis = Redis(host=CONFIG.REDIS_HOST,
                      port=CONFIG.REDIS_PORT,
                      password=CONFIG.REDIS_PASSWORD)
        super().__init__(redis_client=redis,
                         name=name,
                         expire=expire,
                         auto_renewal=auto_renewal)
        self._blocking = blocking