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によって報告されないことが明らかです.
    
    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プログラムの設計に役立つことを願っています.