Quando corro qualcosa del tipo:
from multiprocessing import Pool
p = Pool(5)
def f(x):
return x*x
p.map(f, [1,2,3])
funziona benissimo. Tuttavia, inserendo questo in funzione di una classe:
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()
Mi dà il seguente errore:
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
Ho visto un post di Alex Martelli che trattava lo stesso tipo di problema, ma non era abbastanza esplicito.
IPython.Parallel, ma lì puoi aggirare il problema spingendo gli oggetti sui nodi. Sembra abbastanza fastidioso aggirare questo problema con il multiprocessing.
calculateè serializzabili, così sembra come questo può essere risolto 1) creando un oggetto funzione con un costruttore che copia su un calculategrado e poi 2) passando un'istanza di questo oggetto funzione di Pool's mapmetodo. No?
multiprocessingmodulo sono dovute al suo obiettivo di essere un'implementazione multipiattaforma e alla mancanza di una fork(2)chiamata di sistema simile a Windows. Se non ti interessa il supporto di Win32, potrebbe esserci una soluzione alternativa più semplice basata sul processo. Oppure, se siete pronti a utilizzare i thread, invece di processi, è possibile sostituire from multiprocessing import Poolcon from multiprocessing.pool import ThreadPool as Pool.