我正在使用 python-zookeeper 进行锁定,并且我试图找出一种让执行在它正在观看文件时等待通知的方法,因为它会zookeeper.exists()
立即返回,而不是阻塞。
基本上,我有下面列出的代码,但我不确定实现notify()
andwait_for_notification()
功能的最佳方式。可以用os.kill()
and来完成signal.pause()
,但我敢肯定,如果我以后在一个程序中有多个锁,这可能会导致问题 - 是否有特定的 Python 库对这类事情有好处?
def get_lock(zh):
lockfile = zookeeper.create(zh,lockdir + '/guid-lock-','lock', [ZOO_OPEN_ACL_UNSAFE], zookeeper.EPHEMERAL | zookeeper.SEQUENCE)
while(True):
# this won't work for more than one waiting process, fix later
children = zookeeper.get_children(zh, lockdir)
if len(children) == 1 and children[0] == basename(lockfile):
return lockfile
# yeah, there's a problem here, I'll fix it later
for child in children:
if child < basename(lockfile):
break
# exists will call notify when the watched file changes
if zookeeper.exists(zh, lockdir + '/' + child, notify):
# Process should wait here until notify() wakes it
wait_for_notification()
def drop_lock(zh,lockfile):
zookeeper.delete(zh,lockfile)
def notify(zh, unknown1, unknown2, lockfile):
pass
def wait_for_notification():
pass