Python multiprocess poolモジュールエラーpickling error問題解決方法分析
2200 ワード
この例では、Python multiprocess poolモジュールエラーpickling error問題の解決方法について説明します.皆さんの参考にしてください.具体的には以下の通りです.
に質問
以前、class内の関数を呼び出してmultiprocessingモジュールのpool関数でマルチスレッド処理を行ったとき、以下のエラーメッセージを報告しました.
PicklingError: Can't pickle : attribute lookup __builtin__.function failed
公式ドキュメントを調べるとpythonのデフォルトはpickle以下のタイプしかありません. None, True, and False integers, floating point numbers, complex numbers strings, bytes, bytearrays tuples, lists, sets, and dictionaries containing only picklable objects functions defined at the top level of a module (using def, not lambda) built-in functions defined at the top level of a module classes that are defined at the top level of a module instances of such classes whose dict or the result of calling getstate() is picklable (see section - Pickling Class Instances for details).
関数はpickleが最上位で定義した関数のみで、class内の関数はpickleによって報告されないことが明らかです.
ソリューション
pathosパッケージのmultiprocessingモジュールを元のmultiprocessingの代わりに呼び出します.pathosではmultiprocessingはdillパケットで書き換えられており、dillパケットはほとんどのpythonのタイプをserializeにすることができるのでpickleにすることができます.あるいは自分でdillで書くこともできます(少し車輪作りの嫌さを繰り返しますね)
リファレンス
1. https://stackoverflow.com/questions/8804830/python-multiprocessing-picklingerror-cant-pickle-type-function 2. https://docs.python.org/3/library/pickle.html#what-can-be-pickled-and-unpickled 3. https://github.com/uqfoundation/pathos
Pythonに関する詳細については、「Pythonプロセスとスレッド操作テクニックのまとめ」、「Pythonデータ構造とアルゴリズムチュートリアル」、「Python関数使用テクニックのまとめ」、「Python文字列操作テクニックのまとめ」、「Python入門と進級経典チュートリアル」、「Python+MySQLデータベースプログラム設計入門チュートリアル」および「Python一般データベース操作テクニック要約」
ここではPythonプログラムの設計に役立つことを願っています.
に質問
以前、class内の関数を呼び出してmultiprocessingモジュールのpool関数でマルチスレッド処理を行ったとき、以下のエラーメッセージを報告しました.
PicklingError: Can't pickle : attribute lookup __builtin__.function failed
公式ドキュメントを調べるとpythonのデフォルトはpickle以下のタイプしかありません.
関数はpickleが最上位で定義した関数のみで、class内の関数はpickleによって報告されないことが明らかです.
import multiprocessing
def work(): # top-level
print "work!"
class Foo():
def work(self): # top-level
print "work"
pool1 = multiprocessing.Pool(processes=4)
foo = Foo()
pool1.apply_async(foo.work)
pool1.close()
pool1.join()
#
pool2 = multiprocessing.Pool(processes=4)
pool2.apply_async(work)
pool2.close()
pool2.join()
#
ソリューション
pathosパッケージのmultiprocessingモジュールを元のmultiprocessingの代わりに呼び出します.pathosではmultiprocessingはdillパケットで書き換えられており、dillパケットはほとんどのpythonのタイプをserializeにすることができるのでpickleにすることができます.あるいは自分でdillで書くこともできます(少し車輪作りの嫌さを繰り返しますね)
リファレンス
1. https://stackoverflow.com/questions/8804830/python-multiprocessing-picklingerror-cant-pickle-type-function 2. https://docs.python.org/3/library/pickle.html#what-can-be-pickled-and-unpickled 3. https://github.com/uqfoundation/pathos
Pythonに関する詳細については、「Pythonプロセスとスレッド操作テクニックのまとめ」、「Pythonデータ構造とアルゴリズムチュートリアル」、「Python関数使用テクニックのまとめ」、「Python文字列操作テクニックのまとめ」、「Python入門と進級経典チュートリアル」、「Python+MySQLデータベースプログラム設計入門チュートリアル」および「Python一般データベース操作テクニック要約」
ここではPythonプログラムの設計に役立つことを願っています.