2012-01-08 25 views
5

Soy un novato multiprocesamiento,Python, multihilo demasiado lento, multiproceso

sé algo de enhebrar pero necesito para aumentar la velocidad de este cálculo, es de esperar con multiprocesamiento:

Ejemplo Descripción : envía cadena a un hilo, altera la cadena + prueba de referencia, envía el resultado para la impresión.

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) 

Esto está actualmente lleva unos 6 segundos y lo necesito para ir más rápido.
He estado investigando el multiprocesamiento y no puedo encontrar algo equivalente al código anterior. Creo que lo que busco es agrupando pero los ejemplos que he encontrado han sido difíciles de entender. Me gustaría aprovechar todos los núcleos (8 núcleos) multiprocessing.cpu_count() pero realmente solo tengo restos de información útil sobre multiprocesamiento y no lo suficiente para duplicar el código anterior. Si alguien puede señalarme en la dirección correcta o mejor aún, proporcione un ejemplo que sería muy apreciado. Python 3 por favor

+2

no ocupado, espere a que se complete el subproceso. usa Thread.join()! – soulcheck

+0

¿por qué no? He hecho esto en la mayor parte de mi codificación y si puede proporcionar una buena razón, lo cambiaré todo :) – Rhys

+1

Bueno, es al menos tan bueno como ocupado esperando y probablemente lo hace esperar pasivamente hasta que el hilo se termina sin comer el CPU (aunque no puedo encontrarlo en los documentos, apuesto a que cpython no está ocupado; espera en su Thread.join()). – soulcheck

Respuesta

6

Simplemente reemplace threading con y Thread con Process. ¡Los hilos en Pyton son (casi) nunca utilizados para obtener rendimiento debido al gran mal GIL! Se lo expliqué en una otra SO-post con algunos enlaces a la documentación y una great talk about threading in python.

Pero el módulo multiprocessing es intencionalmente muy similar al módulo threading. ¡Casi puede usarlo como un reemplazo directo!

El módulo de multiprocesamiento no ofrece una funcionalidad AFAIK para exigir el uso de una cantidad específica de núcleos. Se basa en la implementación del sistema operativo. Puede usar el objeto Pool y limitar los proyectos de trabajador al recuento de núcleos. O podrías buscar otra biblioteca de MPI como pypar. En Linux, puede usar una tubería debajo del shell para iniciar varias instancias en diferentes núcleos

+0

Una buena lectura de cómo Python maneja el multiprocesamiento frente al enhebrado en multinúcleo es [aquí] (http://www.martinkral.sk/blog/2011/03/python-multicore-vs-threading-example/) – fuzzyanalysis

+0

@ Don, sí ! parece funcionar. Debo comprobar cuánto más rápido se ejecuta. Una cosa, sin embargo, el código anterior no especifica el número de núcleos utilizados ... ¿sería fácil de incluir? – Rhys

+0

genial eso es lo suficientemente bueno para mí. Aceptado :) – Rhys

Cuestiones relacionadas