2

我只是想在 Python 中实现一个简单的观察者模式并且遇到了一个问题。这是我的代码:

class Observable:
    def __init__(self):
    self.__observers = []

    def register_observer(self, observer):
        self.__observers.append(observer)

    def notify_observers(self, data):
        for observer in self.__observers:
            observer.notify(self, data)

class Observer:

    def __init__(self, observable):
        observable.register_observer(self)
        self.data_present = False
        self.data = ''

    def notify(self, observable, data):
        self.data_present = True
        self.data = data

    def wait(self):
        while True:
            if not self.data_present:
                time.sleep(5)

            else:
                break

        return self.data

在这里,我想消除 Observer.wait() 中的忙碌等待(行 time.sleep(5)。我怎样才能向这个函数发出信号?

4

2 回答 2

1

您根本不需要该wait功能——只需做您需要做的事情notify(处理数据、记录数据、破坏/旋转/折叠数据,等等)。

如果您正在使用线程,请查看Queue.Queue类:它允许多个线程同步数据可用性而无需忙于等待——只需将notify方法推送数据到 aQueue中,然后wait就可以等待了。请注意,使用Threading模块中的一些其他功能可能有一个更优雅的解决方案。

作为旁注,您也不需要双下划线self.__observers-- 就self.observers可以了。

于 2015-06-25T05:18:29.383 回答
1

您可以使用yield暂停某个功能,等待某个值(阻塞,不做忙等待)。

def f():
    print('f: i am waiting for something...')
    c = yield
    print('f: i got %s' % c)
    yield None

另一方面,您调用.send(val)以恢复其执行:

>>> g=f()
>>> next(g)
f: i am waiting for something...
>>> g.send(123)
f: i got 123
>>>

请注意yield None,其末尾的附加f()内容可防止您调用 d 时出现StopIteration异常。raise.send()

于 2015-06-25T05:37:19.400 回答