メモ: multiprocessingを使うまで(Part 2)

概要

・クラスメソッドを並列化しようとすると謎のフリーズを起こすのでそれの回避法
・並列化する関数へ引数を複数個渡す方法
・前回(http://nekopuni.holy.jp/?p=1381)の続き

前回の問題点

前回のmultiprocessingの紹介で、何とか並列化が可能になりめでたしめでたしかと思われたのですが、クラスに組み込むと謎のフリーズが発生します。
具体的には適当なクラスメソッドを並列化する際に発生するようで、以下の様なコードを書いた時に発生します。

色々stackoverflowを徘徊すると同じような問題に陥っているケースが多いようなのですが、イマイチ自分用にまとまった回答が掲載されていなかったのでメモ。

Pythonコード

必要な手順を箇条書きにすると
・おまじないが必要(後述するmultiprocess_with_instance_method.pyをロードする)
 →5行目、これはただ単に参考サイトに載っている一部をコピペして外部ファイルとして保存しただけ

・クラスを定義するときにobjectと書く
 →7行目、どういうわけかここはobjectと書く必要があるようです。

・複数引数の渡し方もついでにメモ。これは相対的に簡単。
 →23行目。これはそのまんま。pool.map()でも複数引数は可能ですが、書き方が少しトリッキーなのでpool.apply_async()のほうが簡単。
となります。それぞれ対応する行をハイライトしておりますので、適宜ご参照ください。

だんだん’__’が顔文字に見えてくるとかいうどうでもいい情報はどうでもいいですね。

参考

Example showing how to use instance methods with the multiprocessing module
https://gist.github.com/fiatmoney/1086393