4

I recently started working with Python for Zookeeper. I am using kazoo library for Zookeeper.

I have a very simple use case using kazoo for Zookeeper. I have a root node which is - /root. Now I need to keep a watch on the root node /root and if the new node which gets added to root node /root is /root/testing then I will only keep a watch on the /root/testing node. I don't want to keep a watch on any other node apart from the testing node. And then if any new children get added up to the /root/testing node, then I will keep a watch on them as well.

Let's say the child below that gets added up -

`/root/testing/test1`

Then I will keep a watch on test1 node as well.

Is this possible to do using Kazoo in Zookeeper? I am only able to keep a watch on one Zookeeper node (/root) with the code below:

#!/usr/bin/python
import time

from kazoo.client import KazooClient

zk = KazooClient(hosts='127.0.0.1:2181')
zk.start()

########################################
@zk.ChildrenWatch("/root/testing")
def watch_children(children):
   print(children)

########################################

while True:
    time.sleep(5)

Can anyone help me with this in making multiple watches on the child node?

arsenal
  • 23,366
  • 85
  • 225
  • 331

2 Answers2

2

Try something like this.

import time
from kazoo.client import KazooClient

zk = KazooClient(hosts='127.0.0.1:2181')
zk.start()

children = zk.get_children("/root/",)
if "/testing" in children:
    children_testing = zk.get_children("/root/testing/")
        if children_testing != []: 
            @zk.ChildrenWatch("/root/testing")
            def watch_children(children):
                print(children)
        else:
            @zk.ChildrenWatch("/root/")
            def watch_children(children):
                print(children)
while True:
    time.sleep(5)
0

If you are trying to watch over multiple nodes, rather than one, you could use multiple threads (basically it runs different code simultaneously on different "threads"). Python has a threading module for doing simultaneous actions, which may be exactly what you want. Here is an example of code with threads implemented.

import threading

def watch_node(node):
    #implement your node watching script here

def watch_in_background(node):
    watcher = threading.Thread(target=watch_node,args=(node))   #initializes a thread that can run the watch_node function in the background, passing the node argument to it
    watcher.start()                                             #tells the thread to start running
    return watcher                                              #returns the thread object just in case you want to use it for something

watch_in_background(<node>)                                     #so this code will now watch the node in the background, allowing you to do other things, like watch multiple nodes
trevorKirkby
  • 1,886
  • 20
  • 47
  • Thanks for the help but my question is specifically related to kazoo library for zookeeper, I am not able to understand how to put a watches on parent child, and then its child as well. – arsenal Nov 24 '13 at 05:45
  • The script that watches the nodes, using Kazoo, can be executed many times at once using threading. The use of Kazoo should not influence threading. – trevorKirkby Nov 25 '13 at 00:22