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()
时被 raise
d。
我只是想在 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()
时被 raise
d。