Island Babies

いろんなことを書きます

マルチプロセスを走らせる時のプログレスバーを表示する

あらすじ

プログレスバー、使ってますか. 僕は最近プログレスバーの素晴らしさに気づきどこでもかしこでもプログレスバーを表示しています.
tqdm というライブラリを使っています. おそらく一番有名なのではないかと思います. 今取り組んでいるプログラムの中で、マルチプロセス化することで動作をより高速にできる部分があったのでその部分をマルチプロセス化していました.
具体的には, multiprocessing.pool というライブラリを用いてマルチプロセス化を行いました. このマルチプロセス化した処理のプログレスバーの表示をパパッとは実装できなかったので、色々調べました.

調べ始める前に思っていたこと

プログレスバーを進めるということは複数のプロセスで一つのプログレスバーを共有しないといけないので、難しそう(こっちのアプローチでも実装できそうな気はしています)

調べた結果

そもそも、 Pool.map()で実行したい関数を渡して処理を行っていました. 幸いにもループの中で変わる引数が一つだけだったので, partial で部分適用した関数を食わせて処理を回していました. いろいろ調べていると、こちらのページimap_unordered が紹介されていて、これが自分の使い方では一番よい使い道なのではないかと思いました. 順序を気にせずイテレータを返されるので、それをそのまま tqdm に食わせることを考えました. 果たしてその通りで, この処理で上手くいったのでした.
上記のページ以外にも、こちらのページ も参考にしました. (imap_unorderd を発見したのはこの記事の中です)

最後に

そもそも論として並行処理・並列処理についてしっかりと勉強したことがない気がするので、その辺りもしっかり調べていきたいと思っている所存です.