2009-11-09 11 views
52

Busco un simple mapa paralelo basado en el proceso de pitón, es decir, una función¿Hay un mapa paralelo basado en procesos simple para python?

parmap(function,[data]) 

que ejecutar la función en cada elemento de [datos] en un proceso diferente (así, en una diferente core, pero AFAIK, la única manera de ejecutar cosas en diferentes núcleos en python es iniciar varios intérpretes), y devolver una lista de resultados.

¿Algo como esto existe? Me gustaría algo simple, por lo que un módulo simple sería bueno. Por supuesto, si no existe tal cosa, me conformaré con una gran biblioteca: -/

Respuesta

93

Me parece que lo que necesita es el map method in multiprocessing.Pool():

map(func, iterable[, chunksize])

A parallel equivalent of the map() built-in function (it supports only 
one iterable argument though). It blocks till the result is ready. 

This method chops the iterable into a number of chunks which it submits to the 
process pool as separate tasks. The (approximate) size of these chunks can be 
specified by setting chunksize to a positive integ 

Por ejemplo, si desea asignar esta función :

def f(x): 
    return x**2 

a la gama (10), se puede hacer utilizando la función incorporada del mapa():

map(f, range(10)) 

o usando un método multiprocesador.Poll() map():

import multiprocessing 
pool = multiprocessing.Pool() 
print pool.map(f, range(10)) 
+0

¡Muchas gracias por su respuesta detallada! –

+4

Si está invocando esto desde un programa de larga duración, asegúrese de llamar a 'pool.close' (idealmente en el bloque' finally' de un encerramiento 'try/finally'). De lo contrario, es posible que el grupo no pueda limpiar los procesos secundarios y pueda terminar con procesos zombies. Ver http://bugs.python.org/issue19675 – rogueleaderr

+2

@rogueleaderr ¿No sería más idiomático usar 'con'? – CodeMonkey

Cuestiones relacionadas