gpt4 book ai didi

python - 多处理和多线程

转载 作者:太空狗 更新时间:2023-10-30 01:16:55 35 4
gpt4 key购买 nike

我之前问过类似的问题,但没有得到有用的回答,所以我会尽量让事情更清楚。

我正在寻找的是对某个 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,请帮忙!

最佳答案

不是传递 subprocess.Popen(首次定义时将串行运行,而不是并行运行),而是传递命令:

import time
import subprocess
from multiprocessing import Process

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']

def timeit(cmd):
print cmd
past = time.time()
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
results = [p.communicate()]
present = time.time()
total = present - past
results.append(total)
return results

p1 = Process(target=timeit, args=(cmd1,))
p2 = Process(target=timeit, args=(cmd2,))

for p in (p1, p2):
p.start()
for p in (p1, p2):
p.join()

预计到达时间:虽然上述解决方案通常是进行多处理的方法,但@Jordan 完全正确,您不应该使用这种方法来为两个版本的软件计时。为什么不按顺序运行它们?

关于python - 多处理和多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9470155/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com