编程语言
首页 > 编程语言> > 是否有用于通知和等待的python库?

是否有用于通知和等待的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