Zookeeper Python应用
来源:互联网 发布:c 三维编程库 编辑:程序博客网 时间:2024/06/04 20:10
所谓保持独占,就是所有试图来获取这个锁的客户端,最终只有一个可以成功获得这把锁。通常的做法是把zk上的一个znode看作是一把锁,通过create znode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。
#!/usr/bin/env python2.7# -*- coding: utf8 -*-"""File: zklock.pyBrief: 分布式锁Author:Date:"""import logging, os, timefrom kazoo.client import KazooClientfrom kazoo.recipe.lock import Lockclass ZKDistributedLock(): def __init__(self, hosts, name, logger=None, timeout=1): """ :param hosts: zookeeper主机地址 :param name: 分布式锁名称 :param logger: 日志对象 :param timeout: 连接超时 """ self._client = None self._lock = None # 创建客户端对象并初始化连接 try: self._client = KazooClient(hosts=hosts, logger=logger, timeout=timeout) self._client.start(timeout=timeout) except Exception, e: logging.error('Create KazooClient Failed! Exception:{}'.format(e)) # 创建Lock对象 try: lock_path = os.path.join("/", "locks", name) self._lock = Lock(self._client, lock_path) except Exception, e: logging.error('Create Lock Failed! Exception: %s'.format(e)) def __enter__(self): """ 上下文管理器 :return: """ if not self.acquire(): raise Exception('Get Lock Failed') return self def __exit__(self, exc_type, exc_val, exc_tb): """ 上下文管理器 :param exc_type: :param exc_val: :param exc_tb: :return: """ self.release() def __del__(self): """ :return: """ self.release() if self._client: self._client.stop() self._client = None def acquire(self, blocking=True, timeout=None): """ 获取锁 :param blocking: :param timeout: :return: """ if self._lock is None: return False try: return self._lock.acquire(blocking=blocking, timeout=timeout) except Exception, e: logging.error('Acquire lock failed! Exception: %s'.format(e)) return False def release(self): """ 释放锁 :return: """ if self._lock is not None: self._lock.release() logging.info('Release Lock')def main(): logger = logging.getLogger() logger.setLevel(logging.INFO) sh = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s -%(module)s:%(filename)s-L%(lineno)d-%(levelname)s: %(message)s') sh.setFormatter(formatter) logger.addHandler(sh) hosts = "172.15.227.217:2181" name = "test" lock = ZKDistributedLock(hosts, name, logger=logger) with lock: logging.info('Get lock ok, sleep 10s') for i in range(1, 11): time.sleep(1) print str(i) logging.info('Release lock') lock.release()if __name__ == "__main__": main()
http://blog.csdn.net/fragmentalice/article/details/78751664
阅读全文
0 0
- Zookeeper Python应用
- Zookeeper应用
- zookeeper应用
- Zookeeper应用
- zookeeper应用
- zookeeper 应用
- Zookeeper的应用
- zookeeper学习和应用
- Zookeeper研究和应用
- Zookeeper的简单应用
- Zookeeper 集群管理应用
- ZooKeeper典型应用场景
- zookeeper应用开发
- ZooKeeper典型应用场景
- zookeeper介绍节应用
- ZooKeeper典型应用场景
- zookeeper 应用开发
- Zookeeper安装和应用
- 数据库为什么用B+树
- 批处理 转义符
- WebStorm2017.2.4激活方法
- 阿里巴巴牵手福特 共同打造智联网汽车
- 今天开始在墓课网学习JavaScript,立贴为证,誓不罢休,一定要精通JS!
- Zookeeper Python应用
- 上下左右移动
- 【Hadoop】搭建完全分布式的hadoop
- 搜索引擎项目的部署
- 安卓指纹识别
- android native 调试
- 在服务器上配置jupyter notebook
- Oracle spool 用法小结
- 基于matlab-GUI数字音频处理系统(一)