进程间锁定食谱,与馆长玩得很好
kazurator的Python项目详细描述
来自curator的Shared Reentrant Read Write Lock配方的python端口。此包依赖于 处理动物园管理员的位子。
在此,您可能想知道为什么我不从kazoo中使用现有的锁配方。原文 我们的目标是让curator和kazoo互相尊重对方的锁:
- 两者都可以获得读锁,只要两者都不持有写 锁定
- 或者可以获取写锁,并阻止 读/写锁
我第一次尝试在kazoo中修补locks配方,但是内部有点不同。(read:i不是 能够使其正常工作。
之所以有必要这样做(至少对我来说),是因为有些代码运行scala并使用curator和其他代码 正在使用kazoo运行python。
安装
pip install kazurator==0.2.0
用法
这个包有两个主要的用例。两者都与 创建进程间关键区域。
与馆长互操作示例
请参阅example目录。
进程间互斥量
首先,让我们看看如何实现一个简单的共享 (跨进程)互斥体:
fromkazoo.clientimportKazooClientfromkazuratorimportMutexdefmain():client=KazooClient(hosts="YOUR_ZK_CONNECT_STRING_HERE")client.start()mutex=Mutex(client,"/some/path")withmutex:# do your thread-safe thing hereclient.stop()
本例假设您希望单个线程处于 地区。为了支持同时多线程访问,您可以 将max_leaseskwarg设置为更高的数字。例如:
mutex=Mutex(client,"/some/path",max_leases=2)# 2 thread at a time
另外,如果您不想使用内容管理协议,可以 直接调用acquire和release。
进程间读写锁
在某些情况下,您需要支持无限数量的读锁, 但只有一个写锁。例如,假设您正在处理 通过改变格式和替换数据(完全 当然是假设的:微笑:)。
您希望数据的任何使用者获得一个读锁。这会 防止更改进程获取写锁,直到 消费者已完成。同样,消费者也无法 获取读锁,直到更改过程移除写锁。
使用者将阻塞,直到锁可用,或者在 指定的timeout(默认值为1s),此时 kazoo.LockTimeout已筹集。
fromkazoo.clientimportKazooClientfromkazuratorimportReadWriteLockdefmain():client=KazooClient(hosts="YOUR_ZK_CONNECT_STRING_HERE")client.start()# can optionally supply `timeout` kwarg as welllock=ReadWriteLock(client,"/some/path")withlock.write_lock:# block until write_lock is available# do your thread-safe thing herewithlock.read_lock:# block until write_lock is gone# do your thread-safe thing hereclient.stop()
开发
- 克隆此回购协议并pip install -r requirements.txt
- 运行测试script/test nosetests
运行测试将生成Docker容器来运行Zookeeper。它 将在运行结束时自动关闭