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.
calculate
ist picklable, also scheint es, dass dies gelöst werden kann, indem 1) ein Funktionsobjekt mit einem Konstruktor erstellt wird, der über eine calculate
Instanz kopiert, und dann 2) eine Instanz dieses Funktionsobjekts an Pool
die map
Methode übergeben wird. Nein?
multiprocessing
Moduls 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 Pool
mit from multiprocessing.pool import ThreadPool as Pool
.