Python多处理池限制问题
我试图编写一个Python脚本来启动有限元模拟代码的多个子进程。我已经能够让Python生成所有子进程,但我的问题是进程池限制似乎被忽略了。如果我尝试生成九个进程,但设置pool=mp.poolprocesss=2,那么所有九个进程仍然会同时启动。如果进程数超过LSDYNA许可证数或计算机上的处理器数,则会出现问题。我已经读了很多关于多处理软件包的书,但这仍然是我第一次尝试使用它。我做错什么了吗Python多处理池限制问题,python,multiprocessing,pool,Python,Multiprocessing,Pool,我试图编写一个Python脚本来启动有限元模拟代码的多个子进程。我已经能够让Python生成所有子进程,但我的问题是进程池限制似乎被忽略了。如果我尝试生成九个进程,但设置pool=mp.poolprocesss=2,那么所有九个进程仍然会同时启动。如果进程数超过LSDYNA许可证数或计算机上的处理器数,则会出现问题。我已经读了很多关于多处理软件包的书,但这仍然是我第一次尝试使用它。我做错什么了吗 import os import multiprocessing as mp import subp
import os
import multiprocessing as mp
import subprocess
import glob
import platform
def run_LSDYNA(individual_sim_dir, model_name, solver_path):
# set LSDYNA environment variables
os.environ['lstc_license'] = 'network'
os.environ['lstc_license_server'] = 'xxx.xx.xx.xx'
# call the cmd prompt with the LSDYNA command line
if platform.system() == 'Windows':
subprocess.call('start "" /D "%s" "%s" i=%s ncpu=1 memory=100m' % (individual_sim_dir, solver_path,
model_name), shell=True)
# elif platform.system() == 'Linux':
# elif platform.system() == 'Darwin':
def unpack(args):
# unpacks each set of arguments into individuals and sends them to the run_LSDYNA function
run_LSDYNA(*args)
def parallel(sim_dir, procs, model_name, solver_path):
# limit the number of parallel processes to the specified value
pool = mp.Pool(processes=procs)
# Loop through the simulation directories and add the arguments for each to the list
args = []
for individual_sim_dir in glob.glob(os.path.join(sim_dir, 'channel_*')):
args.append((individual_sim_dir, model_name, solver_path))
# Send the list of arguments to the unpack function
pool.map_async(unpack, args)
pool.close()
pool.join()
if __name__ == "__main__":
mp.freeze_support()
parallel('C:\Users\me\Desktop\script_test\Lower_Leg_Sims', 2, 'symmetry_with_boot_1_90_180.k', "C:\LSDYNA\program\ls971_s_R5.1.1_winx64_p.exe")
尝试将/WAIT添加到start命令,否则调用将立即返回,并且您将获得太多的数据同时运行。在这里,multiprocessing.pool.ThreadPool将是一个不错的选择。您主要是在等待被调用的进程完成,因此无需生成自己的进程。您是对的@tdelaney,将/W添加到start命令起作用。我花了所有的时间寻找python对这个问题的答案。关于multiprocessing.pool.ThreadPool,快速搜索不会找到大量文档。在我真正开始挖掘之前,如果我切换到它,代码的其余部分是否保持不变?似乎是的,但我想确定我没有遗漏什么。谢谢是的,ThreadPool是Pool的替代品。在windows上,池有很大的开销,因为需要通过清除父环境在子进程中重建执行环境。由于您的工作人员只是在等待子流程完成,因此不需要这样做。您也应该只执行map而不是map\u async,因为您没有处理结果对象。映射时,将chunksize设置为1。mp以块大小的组向工人发送作业,以减少开销,但这意味着一个工人可以完全完成,而另一个工人则在其块中翻腾。分块对大量数据有好处,但处理开销很小,但这里的情况并非如此。