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基于mysql实现的简单队列以及跨进程锁实例详解
Jul 07 Python
初步剖析C语言编程中的结构体
Jan 16 Python
Windows中安装使用Virtualenv来创建独立Python环境
May 31 Python
浅析Python中yield关键词的作用与用法
Nov 29 Python
python批量设置多个Excel文件页眉页脚的脚本
Mar 14 Python
Python计算不规则图形面积算法实现解析
Nov 22 Python
Django集成celery发送异步邮件实例
Dec 17 Python
利用PyTorch实现VGG16教程
Jun 24 Python
Python faker生成器生成虚拟数据代码实例
Jul 20 Python
Windows下Sqlmap环境安装教程详解
Aug 04 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
Sep 01 Python
python爬虫scrapy基本使用超详细教程
Feb 20 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
ThinkPHP实现跨模块调用操作方法概述
2014/06/20 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
简单解决新浪SAE无法上传文件的问题
2015/05/13 PHP
php类的扩展和继承用法实例
2015/06/20 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
2016/03/15 PHP
PHP的Trait机制原理与用法分析
2019/10/18 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
nullJavascript中创建对象的五种方法实例
2013/05/07 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
prototype框架中美元符号$用法分析
2016/01/22 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
JS中实现函数return多个返回值的实例
2017/02/21 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
js导出Excel表格超出26位英文字符的解决方法ES6
2017/11/15 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
2019/02/20 jQuery
vue实现百度下拉列表交互操作示例
2019/03/12 Javascript
IDEA安装vue插件图文详解
2019/09/26 Javascript
python+selenium+autoit实现文件上传功能
2017/08/23 Python
Python中PyQt5/PySide2的按钮控件使用实例
2019/08/17 Python
python实现按首字母分类查找功能
2019/10/31 Python
初学者学习Python好还是Java好
2020/05/26 Python
python MD5加密的示例
2020/10/19 Python
python不同版本的_new_不同点总结
2020/12/09 Python
浅析HTML5 meta viewport参数
2020/10/28 HTML / CSS
机电专业大学生求职信
2013/10/04 职场文书
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
美容院考勤制度
2014/01/30 职场文书
助人为乐模范事迹材料
2014/06/02 职场文书
总经理人事任命书
2014/06/05 职场文书
交通事故一次性赔偿协议书范本
2014/11/02 职场文书
Jupyter notebook 输出部分显示不全的解决方案
2021/04/24 Python
vite+vue3.0+ts+element-plus快速搭建项目的实现
2021/06/24 Vue.js
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫