2010-08-18 5 views

risposta

-1

Avete considerato l'utilizzo di una delle librerie mpi Python come mpi4py? Sebbene MPI venga normalmente utilizzato per distribuire il lavoro in un cluster, funziona piuttosto bene su una singola macchina multicore. Il rovescio della medaglia è che dovrete refactoring il codice per utilizzare le chiamate di comunicazione di MPI (che può essere facile).

7

Dai uno sguardo allo multiprocessing. È un fatto spesso sottovalutato che non condividere i dati a livello globale, e non riempire carichi di thread in un singolo processo, è ciò che i sistemi operativi preferiscono.

Se si insiste ancora sul fatto che il proprio utilizzo intensivo della CPU richiede il threading, consultare la documentazione di working with the GIL in C. È abbastanza istruttivo.

+0

Il problema più grande che ho incontrato cercando di utilizzare il multiprocessing vs threading è che con il tentativo di eseguire 1000+ thread (processi) è possibile ottenere un'istanza separata dell'interprete Python con ciascuno. Questo diventa estremamente costoso in termini di memoria. – Andy

+0

@nalroff: non sembra giusto. La memoria utilizzata per la maggior parte dell'interprete è condivisa da tutte le istanze di quell'interprete. Solo le pagine che differiscono aumentano l'utilizzo totale della memoria. Assicurati di stare guardando al valore giusto.Vale anche la pena notare che i processi non utilizzano una quantità di memoria significativamente maggiore rispetto ai thread aggiuntivi. –

+0

In ogni istanza ho usato il modulo di multiprocessing in Python, ho sempre notato una notevole differenza nell'utilizzo della memoria tra processi e thread. Ad ogni modo, il modulo di threading sembra essere sufficientemente veloce per il raschiamento del web filettato e il test delle prestazioni di una web app, che è tutto ciò che sto usando comunque. – Andy

9

È già possibile interrompere un programma Python in più processi. Il sistema operativo assegnerà già i processi a tutti i core.

Fare questo.

python part1.py | python part2.py | python part3.py | ... etc. 

Il sistema operativo assicura che la parte utilizza il maggior numero possibile di risorse. È possibile trasmettere banalmente le informazioni lungo questa pipeline utilizzando cPickle su sys.stdin e sys.stdout.

Senza troppo lavoro, questo può spesso portare a notevoli aumenti di velocità.

Sì - per l'haterz - è possibile costruire un algoritmo così torturato che potrebbe non essere velocizzato molto. Tuttavia, questo spesso offre enormi benefici per il lavoro minimo.

E.

La ristrutturazione a questo scopo sarà esattamente corrisponde alla ristrutturazione richiesta per massimizzare la concorrenza di thread. Così. Inizia con il parallelismo del processo condiviso-niente finché non puoi dimostrare che condividere più dati sarebbe di aiuto, quindi passa al più complesso parallelismo di thread condiviso.

1

Questo è un buon uso dell'estensione C. La parola chiave da cercare è Py_BEGIN_ALLOW_THREADS.

http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock

P.S. Voglio dire se l'elaborazione è già in C, come l'elaborazione delle immagini, quindi rilasciare il blocco nell'estensione C è buono. Se il codice di elaborazione è principalmente in Python, il suggerimento di altre persone su multiprocessing è migliore. Solitamente non è giustificato riscrivere il codice in C per l'elaborazione in background.

-1

multiprocessing è facile. se questo non è abbastanza veloce, la tua domanda è complicata.