我正在将ZooKeeper拉到一个项目中进行一些并发管理,我尝试的第一件事对我来说非常明显(使用zkpython绑定):
zh = zookeeper.init('localhost:2181')
zookeeper.create(zh, '/path/to/a/node', '', [ZOO_OPEN_ACL_UNSAFE])
因为我的麻烦,我回来了。
在考虑了这个问题并查看了文档(比如它们)之后,我找不到一种方法来做类似于mkdir -p
的事情,ZooKeeper将为我创建缺少的父节点。
是我遗漏了什么,还是我只是为路径的每个部分分别发出create()s,不管我喜欢与否?
您必须为路径的每个元素分别发出create()s。Zookeeper只有内置的原子操作。递归地创建路径不再是一个原子操作。Zookeeper无法知道,如果在创建了一半路径元素后操作挂起,您希望它做什么。 我不知道,python中是否已经有一个Zookeeper助手库。java中有一个(zkClient)允许您通过多次调用create()来创建递归路径。
Kazoo has an ^{} operation ,虽然它不是原子的。使用它至少可以省去编写自己的递归创建代码的需要。
如果发出单独的create()s,则在完成一半时可能会被中断或失败。要使调用成为原子调用,可以使用新的multi() API。见this answer。
如果路径或其一部分可能已经存在,那么在发出下一个之前等待每个create()完成将不必要地缓慢。在这种情况下,可以使用异步API来加快进程。见this answer。
如果您只是想避免额外的调用,可以使用Netflix's curator库,它有一个
creatingParentsIfNeeded
方法,但要注意它可能会很慢。见this answer。相关问题 更多 >
编程相关推荐