4

コルーチン、特に 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 までカウントし、コンシューマーに通知します。コンシューマーは名前とカウント値を出力します。

4

1 に答える 1

4

コルーチン アプローチを使用すると、コンシューマー コードとプロデューサー コードの両方が単純になることがあります。あなたのアプローチでは、そのうちの少なくとも 1 つを有限状態マシンとして記述する必要があります (何らかの状態が関与していると仮定します)。

コルーチンのアプローチでは、それらは本質的に独立したプロセスです。

例が役立ちます:

あなたが提供した例を見てみましょうが、消費者が2番目の入力ごとにのみ印刷すると仮定します。このアプローチでは、受信した入力が奇数サンプルか偶数サンプルかを示すオブジェクト メンバーを追加する必要があります。

def observer(self, data):
    self.odd_sample = !self.odd_sample
    if self.odd_sample:
        print str(data)

コルーチンを使用する場合、入力をループするだけで、1 秒おきに入力が削除されます。「状態」は、コード内の現在の位置によって暗黙的に維持されます。

while True:
    y = producer()
    print(y)
    y = producer()
    # ignore this value
于 2011-04-15T13:56:47.077 に答える