我正在编写一个Python工具,它会自动为我做一些操作。自动化的一部分是并行处理n个LSDYNA有限元模拟。我想将n个模拟发送到池中,并将它们分发给用户指定数量的处理器x。当一个模拟终止时,另一个应该从池发送到空闲处理器,直到池为空。此时,其余的python代码应该继续执行。如果这个代码在我的Windows机器上正常工作,我希望在任何时候看到运行LSDYNA的x个cmd窗口(直到池为空)。
我已经阅读了许多类似的问题,他们似乎最终都使用了多处理模块。我编写了一个我认为正确的代码,但是当我执行它时,没有任何反应。终端窗口中没有错误消息,我没有得到任何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")