私が次のようなものを実行すると:
from multiprocessing import Pool
p = Pool(5)
def f(x):
return x*x
p.map(f, [1,2,3])
それは正常に動作します。ただし、これをクラスの関数として配置すると、次のようになります。
class calculate(object):
def run(self):
def f(x):
return x*x
p = Pool()
return p.map(f, [1,2,3])
cl = calculate()
print cl.run()
次のエラーが表示されます。
Exception in thread Thread-1:
Traceback (most recent call last):
File "/sw/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/sw/lib/python2.6/threading.py", line 484, in run
self.__target(*self.__args, **self.__kwargs)
File "/sw/lib/python2.6/multiprocessing/pool.py", line 225, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
同じ種類の問題を扱っているAlex Martelliからの投稿を見たことがありますが、それは十分に明確ではありませんでした。
IPython.Parallel
がありましたが、オブジェクトをノードにプッシュすることで問題を回避できました。マルチプロセッシングでこの問題を回避するのはかなり面倒です。
calculate
、これは上にコピーすることをコンストラクタと関数オブジェクト作成)1によって解決することができるようですので、pickle化可能なであるcalculate
場合、次いで、2)この関数オブジェクトのインスタンスを渡すPool
のmap
方法。番号?
multiprocessing
モジュールのいくつかの制限は、クロスプラットフォームの実装であるという目標fork(2)
と、Windows でのようなシステムコールの欠如によるものです。Win32のサポートを気にしない場合は、より単純なプロセスベースの回避策があるかもしれません。あなたの代わりにプロセスのスレッドを使用するように準備している場合は、あなたは置き換えることができfrom multiprocessing import Pool
てfrom multiprocessing.pool import ThreadPool as Pool
。