首页 > 解决方案 > 运行外部串行软件的并行实例

问题描述

我正在尝试编写一个 python 函数,它使用多处理来执行外部串行软件的多个实例。使用下面的代码,我可以“启动”外部软件的所有运行,但实际上只有一个软件实例正在计算(即,每次运行都会生成日志文件,但只有一个实例正在更新日志)。我使用的外部程序的一个问题是它只接受一个特定的输入文件名。我对此的最初解决方案是在等待 10 秒的同时逐个启动进程,这样我就可以在每个进程实例启动后更新这个输入文件的信息。换句话说,我在每个实例启动时编写一个新的输入文件。

总的来说,我想做的是为我的 python 程序分配 X # 个 CPU(通过调度程序),然后让我的 python 程序启动 X # 个外部软件的串行实例,以便所有实例并行运行。在外部软件的所有实例完成之前,我也不应该返回主 python 程序。我感谢任何有用的见解!我对这种并行性比较陌生,所以如果我的问题有一个我看不到的非常简单的解决方案,我深表歉意。

from multiprocessing import Process
from subprocess import call, Popen, PIPE
import time

def run_parallel_serial(n_loops=None, name=None, setting=None):

    processes = []
    for i in range(1, n_loops+1, 1):
        prepare_software_input(n_loop=i, info=name)
        processes.append(Process(target=run_software))
    count = 0
    for p in processes:
        update_input(settings[count])
        p.start()
        time.sleep(10)
        count += 1

    for p in processes:
        p.join()
    print("Done running in parallel!")
    return

uprepare_software_input 和 update_input 函数用于写入和覆盖外部软件使用的输入文件。run_software 函数使用 subprocess 模块如下

def run_software():

    p = Popen([PROGRAM_EXEC, SOFTWARE_INPUT_FILE], stdin=PIPE, stdout=PIPE, stderr=PIPE).communicate()
    del(p)
    return

ps 我没有嫁给多处理。如果有不同模块的替代策略,我很乐意切换。

标签: pythonparallel-processingmultiprocessingsubprocesspopen

解决方案


推荐阅读