2011-01-28 8 views
32

He la siguiente función:Cómo dejar Pool.map tomar una función lambda

def copy_file(source_file, target_dir): 
    pass 

Ahora me gustaría utilizar multiprocessing para ejecutar esta función a la vez:

p = Pool(12) 
p.map(lambda x: copy_file(x,target_dir), file_list) 

El problema es , lambda no se puede escabechar, así que esto falla. ¿Cuál es la forma más limpia (pitonica) de arreglar esto?

Respuesta

45

con un objeto 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) 
+2

Gracias, esto es de hecho lo que necesitaba ! –

+1

Gracias! Realmente me gustaría que puedan tomar la función lambda! – yeelan

15

La respuesta a continuación fue afectada porque este does not actually work en python2 desde functools.partial objetos (en python2) no son estibables.

functools.partial objetos se hicieron decapables en Python3, sin embargo, por lo que esta solución funciona allí.


Usted podría utilizar functools.partial:

import functools 
copier=functools.partial(copy_file,target_dir=target_dir) 
p.map(copier,file_list) 

+0

Este incluso se ve más limpio ... Después decidiré cuál contestar –

+0

@ Peter Smit: Vaya, ya vieron mi publicación antes de que la borrara ... Estoy rescatando esto solo para anunciar que no trabajo debido a un error en Python2. – unutbu

+0

Ah, está bien. Estaba buscando en los documentos y no vi ningún comentario sobre la capacidad de picking, así que supuse que eran ... Aceptaré la otra respuesta, ya que parece ser el camino a seguir. –

0

pregunta es un poco viejo, pero si usted todavía está usa Python 2 mi respuesta puede ser útil.

Truco es utilizar parte del proyecto pathos: multiprocess fork de multiprocesamiento. Se deshace de la molesta limitación del multiproceso original.

de 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] 
0

De this respuesta, pathos vamos a ejecutar su lambda p.map(lambda x: copy_file(x,target_dir), file_list) directamente, ahorrando todas las soluciones/hacks

Cuestiones relacionadas