Hice una pregunta similar antes, pero no obtuve ninguna respuesta útil, así que trataré de aclarar las cosas.Multiproceso y multiprocesamiento
Lo que estoy buscando es ejecutar un enfoque multiproceso o preferiblemente de multiprocesamiento a un cierto comando de Linux. Si alguien está familiarizado con Picard, quiero ejecutar una versión anterior en un archivo bam y al mismo tiempo ejecutar una versión más reciente en el mismo archivo bam. La idea es probar cuánto más rápido es la versión más nueva y si da el mismo resultado.
Mi problema principal es que no tengo idea de cómo implementar el multiprocesamiento en un comando de Popen. P.ej.
cmd1 = ['nice', 'time', 'java', '-Xmx6G', '-jar', '/comparison/old_picard/MarkDuplicates.jar', 'I=/comparison/old.bam', 'O=/comparison/old_picard/markdups/old.dupsFlagged.bam', 'M=/comparison/old_picard/markdups/old.metrics.txt', 'TMP_DIR=/comparison', 'VALIDATION_STRINGENCY=LENIENT', 'ASSUME_SORTED=true']
cmd2 = ['nice', 'time', 'java', '-Xmx6G', '-jar', '/comparison/new_picard/MarkDuplicates.jar', 'I=/comparison/new.bam', 'O=/comparison/new_picard/markdups/new.dupsFlagged.bam', 'M=/comparison/new_picard/markdups/new.metrics.txt', 'TMP_DIR=/comparison', 'VALIDATION_STRINGENCY=LENIENT', 'ASSUME_SORTED=true']
c1 = subprocess.Popen(cmd1, stdout=subprocess.PIPE)
c2 = subprocess.Popen(cmd2, stdout=subprocess.PIPE)
y luego tengo una función de temporizador:
def timeit(c):
past = time.time()
results = [c.communicate()]
present = time.time()
total = present - past
results.append(total)
return results
lo que quiero hacer es lo siguiente:
p = Process(target=timeit, args=(c1,c2))
p.start()
p.join()
Sin embargo me sale "no Popen objeto iterable" error. ¿Alguien tiene una idea mejor que la que tengo ahora? No quiero ir en una dirección completamente diferente solo para golpear otra pared. En resumen, quiero ejecutar c1 en una CPU y c2 en la otra al mismo tiempo, ¡por favor ayuda!
¿Por qué quieres ejecutarlos al mismo tiempo? Dudo que obtengas resultados significativos de esto. –
¿Ha considerado ejecutarlos secuencialmente, para que pueda imitar el proceso en sí? La CPU no es el único recurso compartido, por lo que si se trata de una operación que requiere mucha memoria o requiere mucho uso de disco, es posible que tenga un proceso o subproceso que resulte ganador y que tenga la apariencia de ser más rápido. – Jordan