【发布时间】:2012-03-17 05:29:58
【问题描述】:
我之前问过一个类似的问题,但没有得到有用的回答,所以我会尽量让事情更清楚。
我正在寻找的是对某个 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”错误。有没有人比我现在有更好的主意?我不想朝着完全不同的方向前进,只是为了撞到另一堵墙。总之,我想同时在一个 cpu 上运行 c1 并在另一个 cpu 上运行 c2,请帮助!
【问题讨论】:
-
为什么要同时运行它们?我怀疑你会从中得到有意义的结果。
-
您是否考虑过按顺序运行它们,这样您就可以真正模仿该过程本身? CPU 不是唯一的共享资源,因此如果这是一项内存密集型或磁盘密集型操作,您可能有一个进程或线程胜出,并且看起来更快。
标签: python multithreading subprocess multiprocessing