繁体   English   中英

如何使用python3在并行模式下运行外部程序

[英]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类。

  1. 它创建设置数量的进程作为池。
  2. 输入传递到设置的进程数。

检查以下代码:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM