私はずいぶん前に共同作業について聞いたことがあります。私が知っているように、コルーチンはジェネレータに似ています。Pythonでコルーチンが必要なのはなぜですか?
なぜPythonでコルーチンが必要なのですか?
私はずいぶん前に共同作業について聞いたことがあります。私が知っているように、コルーチンはジェネレータに似ています。Pythonでコルーチンが必要なのはなぜですか?
なぜPythonでコルーチンが必要なのですか?
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()
を使って値を送ることができます。
コルーチンは、いくつかの違いがあるジェネレータと似ています。主な違いは以下のとおりです。
あなたはその使用してGoogleへの答えを見つけることができるはずです。ここの答えは、主観的で時間がかかるでしょう。そのような質問はSOの話題とはみなされません。 –
私は同意します。私はそれを使うことができる実際の例を得たいです。 – Rainmaker
David Beasley(dabeaz)は、Pythonのコルーチンの主な支持者の1つだと思います。彼のブログやpyconの話は始めるのに良い場所かもしれません。 –