有限元模拟过程的python多处理

有限元模拟过程的python多处理,python,multiprocessing,Python,Multiprocessing,我正在编写一个Python工具,它将自动为我执行许多操作。自动化的一部分是n个LSDYNA有限元模拟的并行处理。我想将n个模拟发送到一个池中,并将它们分发给用户指定数量的处理器x。当一个模拟终止时,应将另一个模拟从池发送到空闲处理器,直到池为空。此时,其余的python代码应该继续执行。如果这段代码在我的Windows机器上正常工作,我希望看到x个cmd Windows在任何时候运行LSDYNA,直到to池为空 我读过许多类似的问题,它们似乎都使用了多处理模块。我写了一个我认为是正确的代码,但是

我正在编写一个Python工具,它将自动为我执行许多操作。自动化的一部分是n个LSDYNA有限元模拟的并行处理。我想将n个模拟发送到一个池中,并将它们分发给用户指定数量的处理器x。当一个模拟终止时,应将另一个模拟从池发送到空闲处理器,直到池为空。此时,其余的python代码应该继续执行。如果这段代码在我的Windows机器上正常工作,我希望看到x个cmd Windows在任何时候运行LSDYNA,直到to池为空

我读过许多类似的问题,它们似乎都使用了多处理模块。我写了一个我认为是正确的代码,但是当我执行它时,什么也没有发生。终端窗口中没有错误消息,我也没有得到任何LSDYNA输出

我有一个windows批处理脚本,它可以工作,并且做同样的事情,以防对任何人都有帮助

如果我做了一些完全错误的事情,请注意LSDYNA:当通过命令行运行时,每个模拟都在自己的终端窗口中运行。执行命令时,输出文件将写入当前目录。命令格式为:

"C:\LSDYNA\program\ls971_s_R5.1.1_winx64_p.exe" i=input.k ncpu=1 memory=100m
这是我提出的Python代码:

import os
import multiprocessing as mp
import subprocess
import glob

def run_LSDYNA(individual_sim_dir, model_name, solver_path):

    os.chdir(individual_sim_dir)

    os.environ['lstc_license'] = 'network'
    os.environ['lstc_license_server'] = 'xxx.xx.xx.xx'

    subprocess.call([solver_path, "i=%s" % model_name, "ncpu=1", "memory=100m"])

def parallel(sim_dir, procs, model_name, solver_path):

    run_dirs = []

    for individual_sim_dir in glob.glob(os.path.join(sim_dir, 'channel_*')):
        run_dirs.append(individual_sim_dir)

    pool = mp.Pool(processes=procs)

    args = ((run_dir, model_name, solver_path) for run_dir in run_dirs)
    simulations = pool.map_async(run_LSDYNA, args)

    simulations.wait()

if __name__ == "__main__":
    mp.freeze_support()
    parallel('C:\Users\me\Desktop\script_test\Lower_Leg_Sims', 2, 'boot.k', "C:\LSDYNA\program\ls971_s_R5.1.1_winx64_p.exe")

我不确定这里出了什么问题,但你可能想看看波本。它已经产生了一个新的进程,所以调用也一样,但popen并不像调用那样阻塞,所以您不必对多处理做任何事情。要做到这一点,您需要打开n个实例,在循环中轮询它们,并在每次完成时打开一个新实例。一个可能的问题是调用pool.map\u async。我不是肯定的,但我认为这里传递的函数只能用一个参数查看map和itertools.starmap之间的差异。“如果这就是问题所在,我本来希望看到一个异常。我将研究避免多重处理,”马特说。在其他新闻中,通过抛出一些随机打印语句,似乎永远不会调用runlsdyna函数。我还不知道为什么。。。