2013-09-26 17 views
12

Sto cercando di utilizzare il pacchetto multiprocessing per Python. Osservando i tutorial, la tecnica più chiara e intuitiva sembra utilizzare pool.map, che consente all'utente di nominare facilmente il numero di processi e passare una funzione a pool.map e un elenco di valori per quella funzione da distribuire tra le CPU. L'altra tecnica che ho incontrato è using queues per gestire un pool di lavoratori. Questo answer svolge un eccellente lavoro spiegando la differenza tra pool.map, pool.apply e pool.apply_async, ma quali sono i vantaggi e gli svantaggi dell'utilizzo di pool.map rispetto all'utilizzo di code come in questo example?Python Multiprocessing: pool.map vs using code

risposta

9

La tecnica pool.map è un "sottoinsieme" della tecnica con le code. Cioè, senza avere pool.map puoi facilmente implementarlo usando Pool e Queue. Detto questo, l'uso delle code offre molta più flessibilità nel controllo dei processi del pool, ovvero puoi far sì che particolari tipi di messaggi vengano letti solo una volta per la durata dei processi, controllare il comportamento di spegnimento dei processi del pool, ecc.

+0

'pool.map' chiude automaticamente i processi quando viene completato? – Michael

+1

Dalla documentazione: '' Quando l'oggetto pool è garbage collocato, terminate() verrà chiamato immediatamente .''. Ma non ci farei affidamento: sarebbe meglio se ti fossi assicurato che la piscina fosse chiusa alla fine della tua app. Altrimenti, potresti finire con alcuni zombi rimasti nel tuo sistema. Per quanto riguarda 'pool.map' - no, non chiude i processi. I processi vivono fino a quando la loro piscina non è chiusa o orfana. –

4

Se stai davvero cercando la "tecnica più chiara e più diretta", usare concurrent.futures.ProcessPoolExecutor è probabilmente il modo più semplice. Ha un metodo map e alcune altre primitive che lo rendono molto utilizzabile. È anche compatibile con Queue s.

+0

libreria molto semplice e intuitiva. – Jaydev

Problemi correlati