コルーチンとは
たまに耳にしますが、使う機会が無くて全く内容を理解していない、
コルーチンというものについて調査します。
定義
ルーチンの一種で、任意のタイミングで処理の中断と再開が出来るもの、とwikiにありました。
並列処理が出来るとのことですが、同期制御はコルーチンの方が楽なようです。
Python界隈ではよく、ジェネレータとセットで語られることが多いですが、それはジェネレータが処理を中断出来るという性質を持っていて、コルーチンを作ることが出来るからでしょう。現在はasyncioパッケージとasync / awaitキーワードでコルーチンを実現できますが、根底のメカニズムとしてジェネレータが利用されているようです。
pythonにおける並列処理
pythonでは様々な並列処理の方法が用意されています。
- マルチプロセス
multiprocessingパッケージを用います。
- マルチスレッド
threadingパッケージを用います。
- コルーチン(ノンブロッキング)
asyncioパッケージやネイティブコルーチン構文を用います。
これだけ種類があると、一体どれを使ったらいいのか迷ってしまいますね。参考となる記事を以下に貼ります。
qiita.com
要約すると、コア数の範囲内でプロセスを作ることが推奨されていて、プロセスの中に複数のスレッドを立てられて、各スレッドの中にノンブロッキングな処理を組み込むことが出来るということでしょうか。プロセス、スレッド、ノンブロッキングの順番でツリー構造が作れそうです。ノンブロッキングの主なメリットは、大量の並列処理が要求される局面で、大量のスレッドを作らなくても済むというものです。
ネイティブコルーチン
async / awaitキーワードを用います。ジェネレータ構文と内部的な処理は変わらないそうです。所謂、糖衣構文というものでしょうか。@asyncio.coroutineデコレータの代わりにasyncキーワードを用い、yield fromキーワードの代わりにawaitキーワードを用います。
サンプルコード
コルーチンを効果的に用いることが出来る局面としては、大量のキューがあって、それぞれを並列に処理したい場合が考えられます。それぞれのキューの進捗を得ることが出来れば尚良いでしょう。身近なところでは、ダウンロードソフトがそういった処理を行っています。今回はサンプルとしてキューの作成と進捗報告が出来るものを作ってみます。
gist.github.com