Cuando ejecuto algo como:
from multiprocessing import Pool
p = Pool(5)
def f(x):
return x*x
p.map(f, [1,2,3])
funciona bien. Sin embargo, poniendo esto en función de una clase:
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()
Me da el siguiente error:
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
He visto una publicación de Alex Martelli que trata el mismo tipo de problema, pero no fue lo suficientemente explícito.
IPython.Parallel
, pero allí podría solucionar el problema empujando los objetos a los nodos. Parece bastante molesto solucionar este problema con el multiprocesamiento.
calculate
es estibables, por lo que parece que esto puede ser resuelto por 1) la creación de un objeto de función con un constructor que las copias más de una calculate
instancia y luego 2) hacer pasar una instancia de este objeto de función de Pool
's map
método. ¿No?
multiprocessing
módulo se deben a su objetivo de ser una implementación multiplataforma y a la falta de una fork(2)
llamada de sistema similar en Windows. Si no le importa el soporte de Win32, puede haber una solución alternativa más simple basada en procesos. O si está preparado para usar hilos en lugar de procesos, puede sustituirlos from multiprocessing import Pool
por from multiprocessing.pool import ThreadPool as Pool
.