Zookeeper詳細(十):Python接続と操作Zookeeper


PythonによるZookeeperの基本操作
#!/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については、ネット上の多くの投稿は装飾器の方法で実現されていますが、実は私の上の方法は装飾器と同じで、形式が違うだけです.機能はすべて実現できますが、装飾器を使うだけでは不便な場合があります.