文档章节

基于zookeeper的分布式Lock及RLock的实现

Travler
 Travler
发布于 2016/08/27 16:37
字数 227
阅读 111
收藏 0

一.Lock and RLock

需要zookeeper的python 客户端kazoo

# -*- coding: utf-8 -*-
import os
import uuid

from kazoo.client import KazooClient
from kazoo.recipe.lock import Lock


class ZkLock(object):
    def __init__(self,lockname,zkhosts,basepath='/locks',logger=None,timeout=5):

        self._zk_hosts = zkhosts
        #
        self._client = KazooClient(hosts=self._zk_hosts,logger=logger,timeout=timeout)

        self._zk_path = os.path.join(basepath,lockname)
        self._lock_handle = Lock(self._client,self._zk_path)

    def start(self):
        self._client.start()

    def stop(self):
        self._client.stop()

    def acquire(self, blocking=True, timeout=None):
        self.start()
        return self._lock_handle.acquire(blocking=blocking, timeout=timeout)

    def release(self):
        return self._lock_handle.release()

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.release()

class ZkRLock(ZkLock):
    def __init__(self, lockname, basepath='/locks', zkhosts=None, timeout=5):
        super(ZkRLock,self).__init__(lockname=lockname, basepath=basepath, zkhosts=zkhosts, timeout=timeout)
        # self._is_acquired  = False
        self._token = uuid.uuid4().hex
        self.__owner = None
        self.__count = 0

    def acquire(self,blocking=True, timeout=None):
        if self.__owner == self._token:
            self._is_acquired = True
            self.__count += 1
            return True

        self.start()
        rc = self._lock_handle.acquire(blocking=blocking,timeout=timeout)

        if rc:
            self.__owner = self._token
            self.__count = 1
        return rc

    def release(self):
        # if self.__owner != self._token:
        #     raise RuntimeError("cannot release un-acquired lock")

        self.__count -= 1
        if not self.__count:
            self.__owner = None
            return self._lock_handle.release()


© 著作权归作者所有

Travler
粉丝 0
博文 12
码字总数 8055
作品 0
朝阳
程序员
私信 提问
ZooKeeper 实现分布式锁

ZooKeeper 是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、分布式协调/通知、集群管理、Master 选举、分布式锁等功能。 节点 ...

BeckJin
06/16
0
0
基于Zookeeper的分布式锁

zookeeper中几个关于节点的有趣的性质: 有序节点:假如当前有一个父节点为/lock,我们可以在这个父节点下面创建子节点;zookeeper提供了一个可选的有序特性,例如我们可以创建子节点“/lock...

素雷
2017/10/25
28
0
一文弄懂“分布式锁”,一直以来你的选择依据正确吗?

我们本文主要会关注的问题是“分布式锁”的问题。 多线程情况下对共享资源的操作需要加锁,避免数据被写乱,在分布式系统中,这个问题也是存在的,此时就需要一个分布式锁服务。 常见的分布式...

向南
2018/12/04
0
0
分布式设计与开发(三)------高一致性服务ZooKeeper

分布式环境中大多数服务是允许部分失败,也允许数据不一致,但有些最基础的服务是需要高可靠性,高一致性的,这些服务是其他分布式服务运转的基础,比如naming service、分布式lock等,这些分...

山哥
2012/03/19
1K
0
ZooKeeper学习第四期---构建ZooKeeper应用

一、配置服务 配置服务是分布式应用所需要的基本服务之一,它使集群中的机器可以共享配置信息中那些公共的部分。简单地说,ZooKeeper可以作为一个具有高可用性的配置存储器,允许分布式应用的...

卯金刀GG
2017/10/25
31
0

没有更多内容

加载失败,请刷新页面

加载更多

以GPS为例,深入浅出讲解射频接收路径的匹配调试流程

RF接收路径的匹配流程----以GPS为例 调Matching前,至少准备两块板子。 一块完整PCB,有上全部零件 : 一块裸版,完全都没上零件 : 匹配前注意事项—铜管 可能很多人忽略这点,但其实这才是...

demyar
9分钟前
1
0
TI AM570x浮点DSP C66x + ARM Cortex-A15开发板的LCD触摸屏接口、LED指示灯

TL570x-EVM是一款由创龙基于SOM-TL570x核心板设计的开发板,它为用户提供了SOM-TL570x核心板的测试平台,用于快速评估SOM-TL570x核心板的整体性能。 TL570x-EVM底板采用沉金无铅工艺的4层板设...

Tronlong创龙
9分钟前
2
0
docker部署springboot项目

前提条件: 1.可以运行jar包的环境 2.机器上已经安装了docker 3.准备部署的springboot的jar包 4.Dockerfile文件 首先在xshell中连接服务器,然后再创建docker_test,在docker_test下创建jar...

故久呵呵
14分钟前
2
0
MaxCompute问答整理之10月

本文是基于本人对MaxCompute产品的学习进度,再结合开发者社区里面的一些问题,进而整理成文。希望对大家有所帮助。 问题一、DataStudio中是否可以通过shell节点调取MaxCompute sql语句? 不...

一肥仔
15分钟前
1
0
GMAT阅读高速解题6招秘籍分享

在做GMAT阅读题时,你是否曾因为文章内容无聊昏昏欲睡?是否看到第二段就神游不知所云?又是否看完问题选择觉得似乎每个都是正确答案?如果上面这些情况曾经发生在你身上,那么你的阅读方式和心...

bole6
16分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部