16章コルーチン
Python本はいろいろありますが、それらの言うことを信じるとすれば、(コルーチンは)説明が不十分で、不明瞭で、明らかに役に立たないPythonの機能のようです。
——David BeazleyPython本の著者
辞書を引くと、動詞のyieldには主として「生成する」と「譲る」という2つの意味が示されています。Pythonのジェネレータで使用されるyieldキーワードには、どちらの意味も当てはまります。yield itemなどのステートメントは、next(…)の呼び出し元が受け取る値を生成します。また、呼び出し元が次の値を取り込む用意ができるまで、ジェネレータの処理を休止して道を譲りもします。この状態はnext()が再度呼び出されるまで持続され、そのあと呼び出し元はジェネレータから値を取得します。
コルーチンはその本体にyieldキーワードを持った関数にすぎず、構文的にはジェネレータのようなものです。しかし、コルーチンのyieldは通常、datum = yieldのように式の右辺に現れます。また、値を生成することもあれば、しないこともあります。yieldキーワード以降に式がなければ、ジェネレータが生成するのはNoneです。コルーチンは、呼び出し元からデータを受け取ることもあります。コルーチンにデータを送るには、next(…)ではなく.send(datum)を用います。そして呼び出し元はたいてい、コルーチンに値を引き渡します。
yieldキーワードを介したデータのやり取りを、まったく行わないこともあります。データがどのように交換されようと、yieldは制御フローデバイスです。それぞれのコルーチンが中央のスケジューラに制御を譲ることで他のコルーチンを動作させる、協調的なマルチタスクの実装に用いられます。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access