python中的协同程序提供了什么来改善天真的消费者/生产者设置?
作者:互联网
我已经阅读了一些关于协同程序的内容,特别是python,但对我来说并不是很明显.
我已经实现了一个生产者/消费者模型,其基本版本如下:
#!/usr/bin/env python
class MyConsumer(object):
def __init__(self, name):
self.__name = name
def __call__(self, data):
return self.observer(data)
def observer(self, data):
print self.__name + ': ' + str(data)
class MyProducer(object):
def __init__(self):
self.__observers = []
self.__counter = 0
def add_observer(self, observer):
self.__observers.append(observer)
def run(self):
while self.__counter < 10:
for each_observer in self.__observers:
each_observer(self.__counter)
self.__counter += 1
def main():
consumer_one = MyConsumer('consumer one')
consumer_two = MyConsumer('consumer two')
producer = MyProducer()
producer.add_observer(consumer_one)
producer.add_observer(consumer_two)
# run
producer.run()
if __name__ == "__main__":
main()
显然,MyConsumer也可以生成例程,因此可以轻松构建数据管道.正如我在实践中实现的那样,定义了一个基类,它实现了使用者/生产者模型的逻辑,并实现了在子类中覆盖的单个处理函数.这使得使用易于定义的隔离处理元素生成数据管道变得非常简单.
在我看来,这是为协同程序提供的各种应用程序的典型特征,例如在经常引用的教程中:http://www.dabeaz.com/coroutines/index.html.不幸的是,对于我来说,协同程序的优点与上面的实现相比并不明显.我可以看到,在可调用对象更难处理的语言中,有一些东西可以获得,但在python的情况下,这似乎不是问题.
任何人都可以为我阐明这一点吗?谢谢.
编辑:道歉,上面代码中的生产者从0到9计数并通知消费者,消费者然后打印出他们的名字,然后是计数值.
解决方法:
使用协同程序方法时,消费者和生产者代码有时可以更简单.在您的方法中,必须至少将其中一个写为有限状态机(假设涉及某个状态).
使用协同程序方法,它们本质上是独立的过程.
一个例子可以帮助:
以您提供的示例为例,现在假设消费者仅打印每个第二个输入.您的方法需要添加一个对象成员,指示接收的输入是奇数还是偶数样本.
def observer(self, data):
self.odd_sample = !self.odd_sample
if self.odd_sample:
print str(data)
使用协程时,只需循环输入,每秒输入一次. ‘state’由代码中的当前位置隐式维护:
while True:
y = producer()
print(y)
y = producer()
# ignore this value
标签:python,coroutine,observer-pattern,producer-consumer 来源: https://codeday.me/bug/20190626/1296440.html