Python 功能之间的信号以消除忙等待

Python signal between functions to remove busy waiting

我只是想在 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) 行。我怎样才能向这个函数发出信号?

您根本不需要 wait 功能——只需在 notify 中执行您需要的操作(处理数据、记录数据、mutilate/spindle/fold数据,随便什么)。

如果您正在使用线程,请查看 Queue.Queue class: it allows for multiple threads to synchronize on data availability without busy-waiting -- just have the notify method push data into a Queue, and wait can wait on it. Note that there is probably a more elegant solution using some of the other features found in the Threading 模块。

附带说明一下,您也不需要 self.__observers 中的双下划线——只需 self.observers 即可。

您可以使用 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
>>>

请注意 f() 末尾的附加 yield None,它可以防止 StopIteration 异常在您调用 .send() 时被 raised。