Ho fatto una domanda simile prima, ma non ho avuto alcuna risposta utile quindi cercherò di rendere le cose più chiare.Multiprocessing e Multithreading
Quello che sto cercando è di eseguire un approccio multithread o preferibilmente multiprocessing ad un certo comando linux. Se qualcuno ha familiarità con Picard, sto volendo eseguire una versione precedente su un file bam e allo stesso tempo eseguire una versione più recente sullo stesso file bam. L'idea è di testare quanto più veloce è la versione più recente e se dà lo stesso risultato.
Il mio problema principale è che non ho idea di come implementare la multiprocessing su un comando Popen. Per esempio.
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)
E poi ho una funzione timer:
def timeit(c):
past = time.time()
results = [c.communicate()]
present = time.time()
total = present - past
results.append(total)
return results
Quello che voglio fare è questo:
p = Process(target=timeit, args=(c1,c2))
p.start()
p.join()
Tuttavia ottengo "Popen non oggetto iterabile" errore. Qualcuno ha un'idea migliore di quella che ho adesso? Non voglio andare in una direzione completamente diversa solo per colpire un altro muro. In sintesi voglio eseguire c1 su una cpu e c2 sull'altro allo stesso tempo, per favore aiuto!
Perché vuoi eseguirli contemporaneamente? Dubito che otterrai risultati significativi da questo. –
Hai considerato di eseguirli in sequenza, in modo da poter effettivamente simulare il processo stesso? La CPU non è l'unica risorsa condivisa, quindi se si tratta di un'operazione che richiede un utilizzo intensivo della memoria o del disco, è possibile che un processo o un thread stia vincendo e abbia l'aspetto di essere più veloce. – Jordan