ejemplos - python multiprocessing windows
Cómo dejar que Pool.map tome una función lambda (4)
A partir de this respuesta, pathos le permite ejecutar su lambda p.map(lambda x: copy_file(x,target_dir), file_list)
directamente, guardando todas las soluciones p.map(lambda x: copy_file(x,target_dir), file_list)
/ hacks
Tengo la siguiente función:
def copy_file(source_file, target_dir):
pass
Ahora me gustaría utilizar multiprocessing
para ejecutar esta función de una vez:
p = Pool(12)
p.map(lambda x: copy_file(x,target_dir), file_list)
El problema es que el lambda no se puede escabechar, así que esto falla. ¿Cuál es la forma más limpia (pitonica) de arreglar esto?
La pregunta es un poco antigua, pero si aún usas Python 2, mi respuesta puede ser útil.
El truco es usar parte del proyecto pathos : multiprocess tenedor de multiprocesamiento. Se deshace de la molesta limitación del multiproceso original.
Instalación: pip install multiprocess
Uso:
>>> from multiprocess import Pool
>>> p = Pool(4)
>>> print p.map(lambda x: (lambda y:y**2)(x) + x, xrange(10))
[0, 2, 6, 12, 20, 30, 42, 56, 72, 90]
Use un objeto de función:
class Copier(object):
def __init__(self, tgtdir):
self.target_dir = tgtdir
def __call__(self, src):
copy_file(src, self.target_dir)
Para ejecutar su Pool.map
:
p.map(Copier(target_dir), file_list)
Para Python2.7 + o Python3, puede usar functools.partial :
import functools
copier = functools.partial(copy_file, target_dir=target_dir)
p.map(copier, file_list)