2012-08-14 33 views
8

Tengo un script de python para ejecutar algunos comandos externos usando el módulo os.subprocess. Pero uno de estos pasos lleva mucho tiempo y me gustaría ejecutarlo por separado. Necesito lanzarlos, verificar que estén terminados y luego ejecutar el próximo comando que no sea paralelo. Mi código es algo como esto:Cómo ejecutar programas paralelos en python

nproc = 24 
for i in xrange(nproc): 
    #Run program in parallel 

#Combine files generated by the parallel step 
for i in xrange(nproc): 
    handle = open('Niben_%s_structures' % (zfile_name), 'w') 
    for i in xrange(nproc): 
     for zline in open('Niben_%s_file%d_structures' % (zfile_name,i)):handle.write(zline) 
    handle.close() 

#Run next step 
cmd = 'bowtie-build -f Niben_%s_precursors.fa bowtie-index/Niben_%s_precursors' % (zfile_name,zfile_name) 

Respuesta

0

usted puede hacerlo utilizando hilos. Esto es muy corta y el ejemplo (no probado) con muy feo si-lo demás en lo que está haciendo en realidad en el hilo, pero se puede escribir es el propietario clases obreras ..

import threading 

class Worker(threading.Thread): 
    def __init__(self, i): 
     self._i = i 
     super(threading.Thread,self).__init__() 

    def run(self): 
     if self._i == 1: 
      self.result = do_this() 
     elif self._i == 2: 
      self.result = do_that() 

threads = [] 
nproc = 24 
for i in xrange(nproc): 
    #Run program in parallel   
    w = Worker(i) 
    threads.append(w) 
    w.start() 
    w.join() 

# ...now all threads are done 

#Combine files generated by the parallel step 
for i in xrange(nproc): 
    handle = open('Niben_%s_structures' % (zfile_name), 'w') 
    ...etc... 
+0

Esto realmente no hace nada en paralelo, debido al bloqueo 'join()' (que impide que los otros subprocesos se inicien) hasta que termina el hilo. Vea mi respuesta para saber cómo solucionar esto. – pR0Ps

2

Correr cosas en paralelo puede ser también implementado utilizando múltiples procesos en Python. Había escrito un post sobre este tema hace un tiempo, se puede encontrar aquí

http://multicodecjukebox.blogspot.de/2010/11/parallelizing-multiprocessing-commands.html

Básicamente, la idea es utilizar "procesos de trabajo", que recuperan de forma independiente puestos de trabajo de una cola y luego completar estos trabajos .

Funciona bastante bien en mi experiencia.

6

Para su ejemplo, solo desea pagar en paralelo, no necesita hilos para eso.

utilizar el constructor Popen en el módulo subprocess: http://docs.python.org/library/subprocess.htm

recoja el Popen instancias para cada proceso que dio lugar a y luego wait() a que terminen:

procs = [] 
for i in xrange(nproc): 
    procs.append(subprocess.Popen(ARGS_GO_HERE)) #Run program in parallel 
for p in procs: 
    p.wait() 

Puede salirse con esto (como se opone a usar los módulos multiprocessing o threading), ya que no está realmente interesado en que estos interfuncionen, solo desea que el sistema operativo los ejecute en paralelo y asegúrese de que estén terminados cuando vas a combinar los resultados ...

+0

+1 Por alguna razón me perdí ese detalle mientras leía la pregunta. Este es definitivamente el camino a seguir para ejecutar comandos externos. – pR0Ps

+0

Esto es perfecto. Exactamente lo que estaba buscando y mucho más simple que las otras respuestas. El ejemplo de subprocesamiento será muy útil para otras cosas, así que gracias de todos modos – user1598231

+0

@Daren Thomas: ¿Qué tal si quiero obtener el resultado de cada proceso? – hguser

Cuestiones relacionadas