Zookeeper接口kazoo实例解析


Posted in Python onJanuary 22, 2018

本文主要研究的是Zookeeper接口kazoo的相关内容,具体介绍如下。

zookeeper的开发接口以前主要以java和c为主,随着python项目越来越多的使用zookeeper作为分布式集群实现,python的zookeeper接口也出现了很多,现在主流的纯python的zookeeper接口是kazoo。因此如何使用kazoo开发基于python的分布式程序是必须掌握的。

1.安装kazoo

yum install python-pip
pip install kazoo

安装过程中会出现一些python依赖包未安装的情况,安装即可。

2.运行kazoo基础例子kazoo_basic.py

import time
from kazoo.client import KazooClient
from kazoo.client import KazooState
def main():
 zk=KazooClient(hosts='127.0.0.1:2182')
 zk.start()
 
 @zk.add_listener
 def my_listener(state):
 if state == KazooState.LOST:
  print("LOST")
 elif state == KazooState.SUSPENDED:
  print("SUSPENDED")
 else:
  print("Connected")
 #Creating Nodes
 # Ensure a path, create if necessary
 zk.ensure_path("/my/favorite")
 # Create a node with data
 zk.create("/my/favorite/node", b"")
 zk.create("/my/favorite/node/a", b"A")
 #Reading Data
 # Determine if a node exists
 if zk.exists("/my/favorite"):
 print("/my/favorite is existed")
 @zk.ChildrenWatch("/my/favorite/node")
 def watch_children(children):
 print("Children are now: %s" % children)
 # Above function called immediately, and from then on
 @zk.DataWatch("/my/favorite/node")
 def watch_node(data, stat):
 print("Version: %s, data: %s" % (stat.version, data.decode("utf-8")))
 # Print the version of a node and its data
 data, stat = zk.get("/my/favorite/node")
 print("Version: %s, data: %s" % (stat.version, data.decode("utf-8")))
 # List the children
 children = zk.get_children("/my/favorite/node")
 print("There are %s children with names %s" % (len(children), children))
 #Updating Data
 zk.set("/my/favorite", b"some data")
 #Deleting Nodes
 zk.delete("/my/favorite/node/a")
 #Transactions
 transaction = zk.transaction()
 transaction.check('/my/favorite/node', version=-1)
 transaction.create('/my/favorite/node/b', b"B")
 results = transaction.commit()
 print ("Transaction results is %s" % results)
 zk.delete("/my/favorite/node/b")
 zk.delete("/my", recursive=True)
 time.sleep(2)
 zk.stop()
if __name__ == "__main__":
 try:
 main()
 except Exception, ex:
 print "Ocurred Exception: %s" % str(ex)
 quit()

运行结果:

Children are now: [u'a']
Version: 0, data: 
Version: 0, data: 
There are 1 children with names [u'a']
Children are now: []
Transaction results is [True, u'/my/favorite/node/b']
Children are now: [u'b']
Children are now: []
No handlers could be found for logger "kazoo.recipe.watchers"
LOST

以上程序运行了基本kazoo接口命令,包括创建删除加watcher等操作,通过调试并对比zookeeper服务节点znode目录结构的变化,就可以理解具体的操作结果。

3.运行通过kazoo实现的分布式锁程序kazoo_lock.py

import logging, os, time
from kazoo.client import KazooClient
from kazoo.client import KazooState
from kazoo.recipe.lock import Lock

class ZooKeeperLock():
 def __init__(self, hosts, id_str, lock_name, logger=None, timeout=1):
 self.hosts = hosts
 self.id_str = id_str
 self.zk_client = None
 self.timeout = timeout
 self.logger = logger
 self.name = lock_name
 self.lock_handle = None
 self.create_lock()
 def create_lock(self):
 try:
 self.zk_client = KazooClient(hosts=self.hosts, logger=self.logger, timeout=self.timeout)
 self.zk_client.start(timeout=self.timeout)
 except Exception, ex:
 self.init_ret = False
 self.err_str = "Create KazooClient failed! Exception: %s" % str(ex)
 logging.error(self.err_str)
 return
 try:
 lock_path = os.path.join("/", "locks", self.name)
 self.lock_handle = Lock(self.zk_client, lock_path)
 except Exception, ex:
 self.init_ret = False
 self.err_str = "Create lock failed! Exception: %s" % str(ex)
 logging.error(self.err_str)
 return
 def destroy_lock(self):
 #self.release()
 if self.zk_client != None:
 self.zk_client.stop()
 self.zk_client = None
 def acquire(self, blocking=True, timeout=None):
 if self.lock_handle == None:
 return None
 try:
 return self.lock_handle.acquire(blocking=blocking, timeout=timeout)
 except Exception, ex:
 self.err_str = "Acquire lock failed! Exception: %s" % str(ex)
 logging.error(self.err_str)
 return None
 def release(self):
 if self.lock_handle == None:
 return None
 return self.lock_handle.release()
 def __del__(self):
 self.destroy_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)
 zookeeper_hosts = "127.0.0.1:2182"
 lock_name = "test"
 lock = ZooKeeperLock(zookeeper_hosts, "myid is 1", lock_name, logger=logger)
 ret = lock.acquire()
 if not ret:
 logging.info("Can't get lock! Ret: %s", ret)
 return
 logging.info("Get lock! Do something! Sleep 10 secs!")
 for i in range(1, 11):
 time.sleep(1)
 print str(i)
 lock.release()

if __name__ == "__main__":
 try:
 main()
 except Exception, ex:
 print "Ocurred Exception: %s" % str(ex)
 quit()

将该测试文件copy到多个服务器,同时运行,就可以看到分布式锁的效果了。

总结

以上就是本文关于Zookeeper接口kazoo实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python自动扫雷实现方法
Jul 25 Python
通过源码分析Python中的切片赋值
May 08 Python
python验证码识别的示例代码
Sep 21 Python
python 处理dataframe中的时间字段方法
Apr 10 Python
python破解zip加密文件的方法
May 31 Python
python3中函数参数的四种简单用法
Jul 09 Python
python列表返回重复数据的下标
Feb 10 Python
Python如何通过百度翻译API实现翻译功能
Apr 02 Python
Python提取视频中图片的示例(按帧、按秒)
Oct 22 Python
利用python制作拼图小游戏的全过程
Dec 04 Python
Django程序的优化技巧
Apr 29 Python
Python Pandas pandas.read_sql_query函数实例用法分析
Jun 21 Python
Python调用C语言的方法【基于ctypes模块】
Jan 22 #Python
python的Crypto模块实现AES加密实例代码
Jan 22 #Python
python实现求最长回文子串长度
Jan 22 #Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
Jan 22 #Python
Linux CentOS7下安装python3 的方法
Jan 21 #Python
简述Python2与Python3的不同点
Jan 21 #Python
手把手教你用python抢票回家过年(代码简单)
Jan 21 #Python
You might like
自己前几天写的无限分类类
2007/02/14 PHP
php一些错误处理的方法与技巧总结
2013/08/10 PHP
php实现cc攻击防御和防止快速刷新页面示例
2014/02/13 PHP
单台服务器的PHP进程之间实现共享内存的方法
2014/06/13 PHP
php中socket的用法详解
2014/10/24 PHP
php中array_multisort对多维数组排序的方法
2020/06/21 PHP
PHP防盗链的基本思想 防盗链的设置方法
2015/09/25 PHP
Yii2如何批量添加数据
2016/05/17 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
JavaScript调用ajax获取文本文件内容实现代码
2014/03/28 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
分享Javascript实用方法二
2015/12/13 Javascript
微信小程序 教程之wxapp视图容器 scroll-view
2016/10/19 Javascript
jQuery弹出窗口打开链接的实现代码
2016/12/24 Javascript
Vue项目中如何引入icon图标
2018/03/28 Javascript
vue 指定组件缓存实例详解
2018/04/01 Javascript
Vue创建头部组件示例代码详解
2018/10/23 Javascript
跟老齐学Python之list和str比较
2014/09/20 Python
Python使用try except处理程序异常的三种常用方法分析
2018/09/05 Python
Django框架验证码用法实例分析
2019/05/10 Python
python opencv 二值化 计算白色像素点的实例
2019/07/03 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
2019/08/06 Python
python实现kNN算法识别手写体数字的示例代码
2019/08/16 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
python实现粒子群算法
2020/10/15 Python
python利用opencv保存、播放视频
2020/11/02 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
python实现简单文件读写函数
2021/02/25 Python
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
党支部培养考察意见
2015/06/02 职场文书
2016大一新生军训感言
2015/12/08 职场文书
Pandas 数据编码的十种方法
2022/04/20 Python