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之大话题小函数(1)
Oct 10 Python
使用pyecharts无法import Bar的解决方案
Apr 23 Python
python中关于for循环的碎碎念
Jun 30 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
Aug 25 Python
简单实现python进度条脚本
Dec 18 Python
使用python实现语音文件的特征提取方法
Jan 09 Python
Python常用的json标准库
Feb 19 Python
Python提取频域特征知识点浅析
Mar 04 Python
500行Python代码打造刷脸考勤系统
Jun 03 Python
新年福利来一波之Python轻松集齐五福(demo)
Jan 20 Python
浅谈python 类方法/静态方法
Sep 18 Python
PyCharm+Miniconda3安装配置教程详解
Feb 16 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
php获取域名的google收录示例
2014/03/24 PHP
php中数字、字符与对象判断函数用法实例
2014/11/26 PHP
一个简单的javascript类定义例子
2009/09/12 Javascript
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
鼠标滑过出现预览的大图提示效果
2014/02/26 Javascript
自己实现ajax封装示例分享
2014/04/01 Javascript
Jquery Ajax xmlhttp请求成功问题
2015/02/04 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
jQuery获取父元素及父节点的方法小结
2016/04/14 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
js实现开启密码大写提示
2016/12/21 Javascript
Bootstrap的Carousel配合dropload.js实现移动端滑动切换图片
2017/03/10 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
swiper移动端轮播插件(触碰图片之后停止轮播)
2017/12/28 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
2018/08/31 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
M2实现Nodejs项目自动部署的方法步骤
2019/05/05 NodeJs
jquery实现垂直无限轮播的方法分析
2019/07/16 jQuery
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
python实现计算资源图标crc值的方法
2014/10/05 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
三维科技面试题
2013/07/27 面试题
热爱祖国的演讲稿
2014/05/04 职场文书
宪法宣传周工作方案
2014/05/26 职场文书
班级活动总结格式
2014/08/30 职场文书
向国旗敬礼学生寄语大全
2014/09/30 职场文书
女方离婚起诉书
2015/05/18 职场文书
四十年同学聚会致辞
2015/07/28 职场文书
高中政治教师教学反思
2016/02/23 职场文书
Python基础之pandas数据合并
2021/04/27 Python
Redis读写分离搭建的完整步骤
2021/09/14 Redis
python3 字符串str和bytes相互转换
2022/03/23 Python