Я немного почитал про сопрограммы, в частности про питон, и что-то мне не совсем очевидно.
Я реализовал модель производитель/потребитель, базовая версия которой выглядит следующим образом:
#!/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 это не кажется проблемой.
Может ли кто-нибудь пролить свет на это для меня? Спасибо.
edit: извините, производитель в приведенном выше коде считает от 0 до 9 и уведомляет потребителей, которые затем распечатывают свое имя, за которым следует значение счетчика.