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 calculate
grado e poi 2) passando un'istanza di questo oggetto funzione di Pool
's map
metodo. No?
multiprocessing
modulo 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 Pool
con from multiprocessing.pool import ThreadPool as Pool
.