2012-01-08 20 views
5

Sono un principiante multiprocessing,Python, il multithreading troppo lento, multiprocesso

Ho qualche informazione su threading, ma ho bisogno di aumentare la velocità di questo calcolo, si spera con multiprocessing:

Esempio Descrizione : invia una stringa a un thread, altera stringa + test benchmark, restituisce il risultato per la stampa.

from threading import Thread 

class Alter(Thread): 
    def __init__(self, word): 
     Thread.__init__(self) 
     self.word = word 
     self.word2 = '' 

    def run(self): 
     # Alter string + test processing speed 
     for i in range(80000): 
      self.word2 = self.word2 + self.word 

# Send a string to be altered 
thread1 = Alter('foo') 
thread2 = Alter('bar') 
thread1.start() 
thread2.start() 

#wait for both to finish 
while thread1.is_alive() == True: pass 
while thread2.is_alive() == True: pass 


print(thread1.word2) 
print(thread2.word2) 

Questo è attualmente dura circa 6 secondi e ho bisogno di andare più veloce.
Ho esaminato il multiprocessing e non riesco a trovare qualcosa di equivalente al codice precedente. Penso che quello che sto cercando è il che raggruppa ma gli esempi che ho trovato sono stati difficili da capire. Mi piacerebbe sfruttare tutti i core (8 core) multiprocessing.cpu_count() ma ho davvero solo scarti di informazioni utili sul multiprocessing e non abbastanza da duplicare il codice precedente. Se qualcuno può indicarmi la giusta direzione o, meglio ancora, fornire un esempio che sarebbe molto apprezzato. Python 3 per favore

+2

non occupato: attendere il completamento del thread. usa Thread.join()! – soulcheck

+0

perché no? Ho fatto questo in gran parte della mia codifica e se puoi fornire una buona ragione, cambierò tutto :) – Rhys

+1

beh è almeno buono come busy-waiting e probabilmente lo fa passivamente aspettare che il thread sia terminato senza mangiare il cpu (anche se non riesco a trovarlo nei documenti, scommetto che cpython non è occupato-aspetta nel suo thread.join()). – soulcheck

risposta

6

Basta sostituire threading con multiprocessing e Thread con Process. I thread in Pyton sono (quasi) mai usati per ottenere prestazioni a causa del grosso GIL cattivo! L'ho spiegato in un altro SO-post con alcuni collegamenti alla documentazione e un great talk about threading in python.

Ma il modulo multiprocessing è intenzionalmente molto simile al modulo di threading. Puoi quasi usarlo come rimpiazzo in-drop!

Il modulo di multiprocessing non offre AFAIK una funzionalità per imporre l'uso di una quantità specifica di core. Si basa sull'implementazione del sistema operativo. È possibile utilizzare l'oggetto Pool e limitare il worker-onjects al numero di core. O potresti cercare un'altra libreria MPI come pypar. Sotto Linux è possibile utilizzare una pipe sotto la shell per avviare più istanze su diversi core

+0

Una buona lettura di come Python gestisce il multiprocessing rispetto al threading su multicore è [qui] (http://www.martinkral.sk/blog/2011/03/python-multicore-vs-threading-example/) – fuzzyanalysis

+0

@Don, Sì ! sembra funzionare. Devo solo controllare quanto è più veloce la sua corsa. una cosa però, il codice sopra non specifica il numero di core utilizzati ... sarebbe facile da includere? – Rhys

+0

cool è abbastanza buono per me. Accettato :) – Rhys