我读过一些关于协程的文章,尤其是关于 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 计数并通知消费者,然后消费者打印出他们的名字和计数值。