是否有用于通知和等待的python库?
作者:互联网
我正在使用python-zookeeper进行锁定,我正试图找出一种方法来让执行等待通知,当它正在观看文件时,因为zookeeper.exists()立即返回,而不是阻塞.
基本上,我有下面列出的代码,但我不确定实现notify()和wait_for_notification()函数的最佳方法.可以使用os.kill()和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
解决方法:
Python的线程模块中的Condition变量可能非常适合您要执行的操作:
http://docs.python.org/library/threading.html#condition-objects
我已经扩展到这个例子,让你更明白如何根据你的目的调整它:
#!/usr/bin/env python
from collections import deque
from threading import Thread,Condition
QUEUE = deque()
def an_item_is_available():
return bool(QUEUE)
def get_an_available_item():
return QUEUE.popleft()
def make_an_item_available(item):
QUEUE.append(item)
def consume(cv):
cv.acquire()
while not an_item_is_available():
cv.wait()
print 'We got an available item', get_an_available_item()
cv.release()
def produce(cv):
cv.acquire()
make_an_item_available('an item to be processed')
cv.notify()
cv.release()
def main():
cv = Condition()
Thread(target=consume, args=(cv,)).start()
Thread(target=produce, args=(cv,)).start()
if __name__ == '__main__':
main()
标签:python,apache-zookeeper 来源: https://codeday.me/bug/20190723/1511645.html