Python の generator は生成側で coroutine は消費側2022年04月01日 12時20分51秒

最近 Python でのメモリ関連の問題の対処に関わっている。

要約すると、データベースなどのデータを取得する時に、一気に dict や list 型としてまとめて処理していたのが原因。一時的かも知れないが全てのデータがメモリに乗るので、データの量が多くなるにつれてピークも大きくなる。

それに対応するのには一気にまとめずに、データを一つ毎に随時処理をすれば良い。イテーレタを渡して処理を数珠繋ぎにしたり、データではなくストリームを渡したり等の対処になる。

Python でこのような用途に強力なのが、generator と coroutine。generator は iterator を発展させたもので、関数内か複数に渡って戻り値を返す様な事が出来る。基本的にデータの生成側。coroutine はそのデータを消費しつつ制御を generator 側に戻すことが出来る。なお、coroutine は、この時に戻り値を返しながら、generator 側に制御を戻すことも出来る。

まあ、見方によっては関数の内部同士から goto を繰り返す、setlongjmp に見えなくもない。そして、実装時には実際にデータのやりとりがこんがらがりやすい。なにはともあれ、データのピークを避けての随時処理には向いている。

後々、簡単な例をあげて、まとめておきたいと思う。