2009-11-09 17 views
52

Sto cercando un semplice mappa parallelo basato sui processi per Python, cioè una funzioneEsiste una semplice mappa parallela basata sui processi per python?

parmap(function,[data]) 

che avrebbe eseguito la funzione su ogni elemento della [i dati] su un processo diverso (o meglio, su una diversa core, ma AFAIK, l'unico modo per eseguire cose su core diversi in python è avviare più interpreti) e restituire un elenco di risultati.

Esiste qualcosa del genere? Vorrei qualcosa semplice, quindi un modulo semplice sarebbe bello. Naturalmente, se non esiste nulla di simile, mi accontenterò di una grande biblioteca: -/

risposta

93

Mi sembra che ciò che serve è il 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 

Ad esempio, se si voleva mappare questa funzione :

def f(x): 
    return x**2 

alla gamma (10), è possibile farlo utilizzando la) funzione built-in mappa (:

map(f, range(10)) 

o utilizzando una mappa del metodo dell'oggetto multiprocessing.Poll()():

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

Grazie mille per la tua risposta dettagliata! –

+4

Se stai invocando questo da un programma di lunga durata, assicurati di chiamare 'pool.close' (idealmente nel blocco' finally' di un racchiudere 'try/finally'). Altrimenti il ​​pool potrebbe non riuscire a ripulire i processi figli e si può finire con i processi di zombi. Vedi http://bugs.python.org/issue19675 – rogueleaderr

+2

@rogueleaderr Non sarebbe più idiomatico usare 'with'? – CodeMonkey

Problemi correlati