[英]How to run an external program in parallel mode using python3
我有一个文件名列表,我需要在它们上运行一个外部程序 ( lastz程序)。 外部程序需要两个输入文件并生成一个输出文件,这需要1-2个小时,具体取决于输入文件的大小。
我下面的程序一次运行一个外部程序。
import subprocess
def run_lastz(input1, input2, output):
cmd_string = "lastz '{}'[multiple] {} --ambiguous=iupac --ambiguous=n --format=sam --output='{}' --chain --gapped ".format(file1, file2, output)
print(cmd_string)
process = subprocess.Popen(cmd_string, shell=True, stdout=subprocess.PIPE)
process.wait()
file_name_list = ['1.txt', '2.txt', '3.text', '15.txt', '111.txt', '31.txt', '41.txt', '50.txt', '1011.txt']
for file1 in file_name_list:
for file2 in file_name_list:
if file1 != file2:
out_file = '{}__{}.out'.format(file1, file2)
run_lastz(file1, file2, out_file)
现在,我正在尝试提高运行外部程序的速度,这可以通过在并行模式下运行多个此类程序来实现。
我认为多线程或多处理可以解决上述问题,并且我对多线程或多处理非常陌生。 需要一些帮助。 我的目标是一次仅运行约8到12个外部程序,一旦完成将其移至下一组。
使用多重处理而不是多线程,因为它存在GIL问题。
为了限制进程数,我们需要在多进程中使用Pool类。
检查以下代码:
from multiprocessing import Pool
def run_lastz(file_tuple):
f1,f2,out = file_tuple
print " Working with input -",f1,f2,out
print "----------------------------------"
if __name__ == '__main__':
# Start 10 worker processes
pool = Pool(processes=10)
#Then create a list of input list [(1.txt,2.txt,1_2.out),(2.txt,3.txt,2_3.out)....]
file_name_list = ['1.txt', '2.txt', '3.text', '15.txt', '111.txt', '31.txt', '41.txt', '50.txt', '1011.txt']
f_list =[]
for file1 in file_name_list:
for file2 in file_name_list:
if file1 != file2:
out_file = '{}__{}.out'.format(file1, file2)
t_list =(file1,file2,out_file)
f_list.append(t_list)
#Map input list with target function
pool.map(run_lastz, f_list)
注意 :
出于演示目的,我从run_lastz
函数中删除了原始代码。 一旦理解了上面的代码并能够运行,请修改run_lastz
函数的功能。
另外,通过上面的链接进行更详细的了解也是我的谦虚要求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.