2016-12-02 5 views
0

私はずいぶん前に共同作業について聞いたことがあります。私が知っているように、コルーチンはジェネレータに似ています。Pythonでコルーチンが必要なのはなぜですか?

なぜPythonでコルーチンが必要なのですか?

+0

あなたはその使用してGoogleへの答えを見つけることができるはずです。ここの答えは、主観的で時間がかかるでしょう。そのような質問はSOの話題とはみなされません。 –

+0

私は同意します。私はそれを使うことができる実際の例を得たいです。 – Rainmaker

+2

David Beasley(dabeaz)は、Pythonのコルーチンの主な支持者の1つだと思います。彼のブログやpyconの話は始めるのに良い場所かもしれません。 –

答えて

1

Generatorは、yieldを返します。 Pythonジェネレータ関数は、(yield)文を使用して値を使用することもできます。さらに、ジェネレータオブジェクトの2つの新しいメソッド、send()およびclose()は、値を消費および生成するオブジェクト用のフレームワークを作成します。これらのオブジェクトを定義するGenerator関数は、coroutinesと呼ばれます。次のように

コルーチンは(yield)文を使用して値を消費します。オブジェクトのsendメソッドは、引数で呼び出されるまで、この構文で

value = (yield) 

、実行はこの文で一時停止:

coroutine.send(data) 

その後、実行が再開され、値がデータの値に割り当てられます。計算の終了を知らせるために、close()メソッドを使用してコルーチンをシャットダウンします。これにより、コルーチン内でGeneratorExit例外が発生します。これはtry/except節で捕捉できます。

以下の例は、これらの概念を示しています。これは、提供されたパターンに一致する文字列を出力するコルーチンです。

def match(pattern): 
    print('Looking for ' + pattern) 
    try: 
     while True: 
      s = (yield) 
      if pattern in s: 
       print(s) 
    except GeneratorExit: 
     print("=== Done ===") 

我々はパターンとそれを初期化し、実行を開始する__next__()を呼び出します。

m = match("Jabberwock") 
m.__next__() 
Looking for Jabberwock 

__next__()への呼び出しは、関数の本体を実行させるので、ラインは「とかげ探しています」印刷されます。実行は文line = (yield)に遭遇するまで続きます。次に、実行が一時停止し、mに値が送信されるのを待ちます。 send()を使って値を送ることができます。

0

コルーチンは、いくつかの違いがあるジェネレータと似ています。主な違いは以下のとおりです。

  1. 発生器は、データ生産者である
  2. コルーチンは、データコンシューマ

You may have a look here for details

関連する問題