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到多个服务器,同时运行,就可以看到分布式锁的效果了。

参考链接:

http://kazoo.readthedocs.org/en/latest/basic_usage.html

http://yunjianfei.iteye.com/blog/2164888

时间: 2024-12-24 01:09:49

Zookeeper深入理解(三)kazoo接口的相关文章

深入理解Java的接口和抽象类(转)

深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一.抽象类 二.接口 三.抽象类和接口的区别 若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.

(转载)深入理解java的接口和抽象类

本文转自地址:http://www.cnblogs.com/dolphin0520/p/3811437.html 作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类

【转】深入理解Java的接口和抽象类

深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一.抽象类 二.接口 三.抽象类和接口的区别 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有具体的实现.抽象方法的声明格式为:

Java基础__慕课网学习(24):深入理解抽象类与接口(转)

深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一.抽象类 二.接口 三.抽象类和接口的区别 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有具体的实现.抽象方法的声明格式为:

深入理解Java的接口和抽象类 _摘抄

http://www.cnblogs.com/dolphin0520/p/3811437.html 原文 深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一.抽象类 二.接口 三.抽象类和接口的区别 若有不正之处,请多多谅解并

VLAN终结及三层子接口

VLAN终结是指trunk口与三层口连接时,三层口将VLAN tag去掉,VLAN终结于三层口中.为了让三层口能终结不同的VLAN,并且让VLAN间互通,引入了三层子接口的概念.假设HOST A与SW1/1连接,SW1/1为access口,属于VLAN 10;HOST B与SW1/2连接,SW1/2为access口,属于VLAN20;SW1/3与ROUT1/1连接,SW1/3为TRUNK口,permit VLAN 10和VLAN 20:HOST A的IP为192.168.1.2/24;HOST

.NET中的三种接口实现方式

摘自:http://www.cnblogs.com/zhangronghua/archive/2009/11/25/1610713.html 一般来说.NET提供了三种不同的接口实现方式,分别为隐式接口实现.显式接口实现.混合式接口实现.这三种方式各有各的特点. 首先来看隐式接口实现,这恐怕是我们使用最多的一种接口实现,因为隐匿接口实现是.NET的默认接口实现方式.下面让我们来看一个隐式接口实现的例子: using System; internal class MyClass { public

BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第2章节--SharePoint 2013 App 模型概览 理解三个SharePoint 部署模型 Apps

BEGINNING SHAREPOINT? 2013 DEVELOPMENT 第2章节--SharePoint 2013 App 模型概览 理解三个SharePoint 部署模型 Apps 由于SharePoint 2013 正逐步移动到云,有三类部署模型可用来帮助你完毕这个目标(关于SharePoint Apps): SharePoint-hosted: Autohosted: Provider-hosted: 每一类部署模型都含有特色,使它成为针对不同类型App开发的理想的(选择).以下的部

深入理解Java之接口

1. 为什么使用接口 Java中的接口是一组对需求的描述.例如,以下是Comparable<T>接口的定义: public interface Comparable<T> { int compareTo(T o); } Comparable<T>接口中定义了一个compareTo方法,这个方法就是它所描述的需求.若我们想调用Arrays.sort方法对一个People对象数组进行比较,那么People对象必须是”可比较的”,即People类需要实现Comparable&