Python мультипроцессирование процессов моделирования конечных элементов
Я пишу инструмент Python, который автоматически выполнит ряд операций за меня. Одной из частей автоматизации является параллельная обработка n чисел моделирования конечных элементов LSDYNA. Я хочу отправить n симуляций в пул и распределить их по указанному пользователем количеству процессоров, х. Когда одна симуляция завершается, другую следует отправлять из пула в незанятый процессор до тех пор, пока пул не станет пустым. В это время остальная часть кода Python должна продолжать выполняться. Если бы этот код работал правильно на моей машине с Windows, я бы ожидал увидеть x количество окон cmd, работающих с LSDYNA, в любое время (пока пул не будет пуст).
Я прочитал несколько похожих вопросов, и все они, похоже, заканчиваются использованием модуля многопроцессорной обработки. Я написал код, который мне показался правильным, однако, когда я его выполняю, ничего не происходит. В окне терминала нет сообщений об ошибках, и я не получаю вывод 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")