マルチプロセッシングでは、Pool.map() 関数はタスクをプロセス間で分割して同時実行します。ただし、次のコードに示すように、バインドされたメソッドを使用するとエラーが発生する可能性があります。
import multiprocessing def f(x): return x*x def go(): pool = multiprocessing.Pool(processes=4) print pool.map(f, range(10)) if __name__== '__main__' : go()
このコードはシームレスに動作します。ただし、よりオブジェクト指向のアプローチを使用すると、エラーで失敗する可能性があります:
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
このエラーは、次のコードに示すように、バインドされたメソッドで Pool.map() を使用しようとすると発生します。
import someClass if __name__== '__main__' : sc = someClass.someClass() sc.go() class someClass(object): def __init__(self): pass def f(self, x): return x*x def go(self): pool = multiprocessing.Pool(processes=4) print pool.map(self.f, range(10))
解決策:
この問題は、マルチプロセッシングの要件に起因します。オブジェクトを pickle にしてプロセス間で分散します。ただし、バインドされたメソッドは本質的に pickle 可能ではありません。解決策には、pickle を有効にするために必要なインフラストラクチャの作成が含まれます。
1 つのアプローチは、pickle 関数と unpickle 関数を登録するために copy_reg 標準ライブラリ メソッドを使用することです。たとえば、関連するディスカッション スレッドへの Steven Bethard の貢献は、copy_reg を使用したメソッドの pickle 化および unpickle 化のための実行可能なアプローチを提供しています。
以上がマルチプロセッシングが「Can't Pickle InstanceMethod」で失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。