Wenn ich so etwas wie:
from multiprocessing import Pool
p = Pool(5)
def f(x):
return x*x
p.map(f, [1,2,3])
es funktioniert gut. Setzen Sie dies jedoch als Funktion einer Klasse:
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()
Gibt mir folgenden Fehler:
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
Ich habe einen Beitrag von Alex Martelli gesehen, der sich mit der gleichen Art von Problem befasst, aber er war nicht explizit genug.
IPython.Parallel, aber dort konnte man das Problem umgehen, indem man die Objekte auf die Knoten schob. Es scheint ziemlich ärgerlich, dieses Problem mit Multiprocessing zu umgehen.
calculateist picklable, also scheint es, dass dies gelöst werden kann, indem 1) ein Funktionsobjekt mit einem Konstruktor erstellt wird, der über eine calculateInstanz kopiert, und dann 2) eine Instanz dieses Funktionsobjekts an Pooldie mapMethode übergeben wird. Nein?
multiprocessingModuls sind auf das Ziel einer plattformübergreifenden Implementierung und das Fehlen eines fork(2)ähnlichen Systemaufrufs in Windows zurückzuführen. Wenn Sie sich nicht für die Win32-Unterstützung interessieren, gibt es möglicherweise eine einfachere prozessbasierte Problemumgehung. Oder wenn Sie bereit Threads anstelle von Prozessen zu verwenden, können Sie ersetzen from multiprocessing import Poolmit from multiprocessing.pool import ThreadPool as Pool.