Многопроцессорность и многопоточность

Я задавал аналогичный вопрос раньше, но не получил полезного ответа, поэтому я постараюсь прояснить ситуацию.

Я ищу возможность реализовать многопоточный или предпочтительно многопроцессорный подход к определенной команде Linux. Если кто-нибудь знаком с Picard , я хочу запустить более раннюю версию для файла BAM и в то же время запустить более новую версию в том же файле BAM. Идея состоит в том, чтобы проверить, насколько быстрее работает новая версия и дает ли она такой же результат.

Моя основная проблема в том, что я понятия не имею, как реализовать многопроцессорность в команде Popen. Например.

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)

И затем у меня есть функция таймера:

def timeit(c):
    past = time.time()
    results = [c.communicate()]
    present = time.time()
    total = present - past
    results.append(total)
    return results

Я ХОЧУ сделать следующее:

p = Process(target=timeit, args=(c1,c2))
p.start()
p.join()

Однако я получаю ошибку «Popen object not iterable». Есть ли у кого-нибудь идеи получше, чем у меня сейчас? Я не хочу уходить в совершенно другом направлении только для того, чтобы удариться о другую стену. Таким образом, я хочу запустить c1 на одном процессоре и c2 на другом одновременно. Пожалуйста, помогите!

5
задан 27 February 2012 в 18:25
поделиться