Zookeeper詳細(十):Python接続と操作Zookeeper
PythonによるZookeeperの基本操作
Watcherイベントアクション
Watcherについては、ネット上の多くの投稿は装飾器の方法で実現されていますが、実は私の上の方法は装飾器と同じで、形式が違うだけです.機能はすべて実現できますが、装飾器を使うだけでは不便な場合があります.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from kazoo.client import KazooClient
def main():
try:
nodePath = "/zktest"
host = "172.16.48.171"
port = "2181"
timeout = 100
zkc = KazooClient(hosts=host + ':' + port, timeout=timeout)
zkc.start()
#
if zkc.exists(nodePath+"/test111"):
print nodePath + "/test111", " "
else:
# ,
childrenPath = zkc.create(nodePath+"/test111", "test111")
print " :", childrenPath, " 。"
# ,
zkc.create(nodePath+"/test999", "test999", ephemeral=True)
# , 2 , , stat, ZnodeStat , , 12
dataAndStat = zkc.get(nodePath)
data = dataAndStat[0]
print " :", data
stat = dataAndStat[1]
print " :", stat.version
print " :", stat.data_length
print " :", stat.numChildren
# , 1MB , ZnodeStat
stat = zkc.set(nodePath, value="test222")
print " :", stat.version
# , , False, , ,
#
if zkc.exists(nodePath+"/test111"):
result = zkc.delete(nodePath+"/test111", recursive=False)
if result:
print " 。"
print nodePath + " :", zkc.get_children(nodePath)
zkc.close()
zkc.stop()
except Exception as err:
print err.message
if __name__ == "__main__":
try:
main()
finally:
sys.exit()
Watcherイベントアクション
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import time
from kazoo.client import KazooClient
from kazoo.client import ChildrenWatch
from kazoo.client import DataWatch
"""
Watcher , ZK , zk.get_children("/node", watch=FUN),
, 。
API , , 。 zookeeper JAVA ,
API JAVA zkclient, Python kazoo。 API API , 。
"""
__metaclass__ = type
class zkWatcherTest:
def __init__(self, host, port, timeout=10):
self._nodename = ''
self._host = host
self._port = port
self._timeout = timeout
self._zk = KazooClient(hosts=self._host + ':' + self._port, timeout=self._timeout)
self._zk.start()
self._lastNodeList = []
def start(self, zkPath):
self._lastNodeList = self._zk.get_children(zkPath)
try:
ChildrenWatch(client=self._zk, path=zkPath, func=self._NodeChange)
DataWatch(client=self._zk, path=zkPath, func=self._DataChange)
# , , 60 ,
# 。 wathch , ,
# 。
while True:
time.sleep(60)
print "OK"
except Exception as err:
print err.message
def _NodeChange(self, children):
"""
:param children: , ChiledrenWatcher,
:return:
"""
# print children
# ,
if len(children) > len(self._lastNodeList):
for node in children:
if node not in self._lastNodeList:
print " :", str(node)
self._lastNodeList = children
else:
for node in self._lastNodeList:
if node not in children:
print " :", str(node)
self._lastNodeList = children
def _DataChange(self, data, stat):
"""
:param data:
:param stat:
:return:
"""
print " "
print " :", data
print " :", stat.dataLength
print " version:", stat.version
print "cversion:", stat.cversion
print " :", stat.numChildren
def main():
try:
zkwt =zkWatcherTest(host="172.16.48.171", port="2181")
zkwt.start("/zktest")
except Exception as err:
print err.message
if __name__ == "__main__":
try:
main()
finally:
sys.exit()
Watcherについては、ネット上の多くの投稿は装飾器の方法で実現されていますが、実は私の上の方法は装飾器と同じで、形式が違うだけです.機能はすべて実現できますが、装飾器を使うだけでは不便な場合があります.