Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多处理池限制问题_Python_Multiprocessing_Pool - Fatal编程技术网

Python多处理池限制问题

Python多处理池限制问题,python,multiprocessing,pool,Python,Multiprocessing,Pool,我试图编写一个Python脚本来启动有限元模拟代码的多个子进程。我已经能够让Python生成所有子进程,但我的问题是进程池限制似乎被忽略了。如果我尝试生成九个进程,但设置pool=mp.poolprocesss=2,那么所有九个进程仍然会同时启动。如果进程数超过LSDYNA许可证数或计算机上的处理器数,则会出现问题。我已经读了很多关于多处理软件包的书,但这仍然是我第一次尝试使用它。我做错什么了吗 import os import multiprocessing as mp import subp

我试图编写一个Python脚本来启动有限元模拟代码的多个子进程。我已经能够让Python生成所有子进程,但我的问题是进程池限制似乎被忽略了。如果我尝试生成九个进程,但设置pool=mp.poolprocesss=2,那么所有九个进程仍然会同时启动。如果进程数超过LSDYNA许可证数或计算机上的处理器数,则会出现问题。我已经读了很多关于多处理软件包的书,但这仍然是我第一次尝试使用它。我做错什么了吗

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以块大小的组向工人发送作业,以减少开销,但这意味着一个工人可以完全完成,而另一个工人则在其块中翻腾。分块对大量数据有好处,但处理开销很小,但这里的情况并非如此。