Tengo el siguiente código.¿Cómo evito este error de decapado y cuál es la mejor forma de paralelizar este código en Python?
def main():
(minI, maxI, iStep, minJ, maxJ, jStep, a, b, numProcessors) = sys.argv
for i in range(minI, maxI, iStep):
for j in range(minJ, maxJ, jStep):
p = multiprocessing.Process(target=functionA, args=(minI, minJ))
p.start()
def functionB((a, b)):
subprocess.call('program1 %s %s %s %s %s %s' %(c, a, b, 'file1',
'file2', 'file3'), shell=True)
for d in ['a', 'b', 'c']:
subprocess.call('program2 %s %s %s %s %s' %(d, 'file4', 'file5',
'file6', 'file7'), shell=True)
abProduct = list(itertools.product(range(0, 10), range(0, 10)))
pool = multiprocessing.Pool(processes=numProcessors)
pool.map(functionB, abProduct)
Produce el siguiente error.
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib64/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/usr/lib64/python2.6/threading.py", line 484, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib64/python2.6/multiprocessing/pool.py", line 255, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function fa
iled
Los contenidos de la función A no son importantes y no producen un error. El error parece ocurrir cuando trato de mapear la función B. ¿Cómo elimino este error y cuál es la mejor forma de paralelizar este código en Python 2.6?
Sólo me preguntaba ... ¿Cuál es el propósito de utilizar el módulo de multiprocesamiento aquí cuando se está uniendo en cada proceso de empezar ... básicamente ejecutarlas en serie. – jdi
posible duplicado de [Can not pickle cuando se utiliza el multiproceso de Python Pool.map()] (http://stackoverflow.com/questions/1816958/cant-pickle-type-type-instancemethod-when-using- pythons-multiprocessing-pool-ma) –
msw
'functionB' puede necesitar estar en el ámbito de nivel de archivo, no en el de main. Intenta ponerlo allí. – ldrg