Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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 - Fatal编程技术网

python方法的多处理

python方法的多处理,python,multiprocessing,Python,Multiprocessing,我编写了一个名为“get_names”的方法,该方法接受参数作为包含多个python脚本(其中可能有多个文件夹)的文件夹路径,并返回这些python脚本中所有方法的名称 但是由于文件夹中有大量python脚本,打印所有方法的名称需要花费大量时间。我计划创建3-4个进程,这些进程将在python脚本数量的三分之一/四分之一上运行 我应该如何编写方法来实现这一点,以便我的方法知道它必须处理脚本的哪一部分 names = name_loader.get_names(name_prefix=params

我编写了一个名为“get_names”的方法,该方法接受参数作为包含多个python脚本(其中可能有多个文件夹)的文件夹路径,并返回这些python脚本中所有方法的名称

但是由于文件夹中有大量python脚本,打印所有方法的名称需要花费大量时间。我计划创建3-4个进程,这些进程将在python脚本数量的三分之一/四分之一上运行

我应该如何编写方法来实现这一点,以便我的方法知道它必须处理脚本的哪一部分

names = name_loader.get_names(name_prefix=params.get('name_prefix'))

“name\u prefix”可以是/users/Aditya/workspace/codes/其中“codes”包含所有python脚本。

您可以这样做:

import multiprocessing

if __name__ == "__main__":
    calc_pool = multiprocessing.Pool(4)
    path = 'list with your paths'
    methode = calc_pool.map(get_names, path)
您可能需要编辑您的方法,因此它会将带有python文件的列表拆分为4个子列表,在这种情况下,每个进程将处理一个子列表,这些子列表是您的完整列表。例如:

import multiprocessing

if __name__ == "__main__":
    calc_pool = multiprocessing.Pool(4)
    path = 'list with your paths'
    path = split(path, parts = 4)
    data_pack = ((path[0]), (path[1]), (path[2]), (path[3]))
    methode = calc_pool.map(get_names, data_pack)
在这种情况下,您必须打包数据,因为
.map
只接受一个参数。在这种情况下,方法
split
使用如下路径拆分列表:

path = ['path_0', 'path_1', 'path_2', 'path_3']
对这样的事情:

path = [['path_0'], ['path_1'], ['path_2'], ['path_3']]
请记住,多处理进程不共享数据,并且您希望提交尽可能少的数据,因为向每个进程发送数据非常慢

这也明显增加了CPU和RAM的使用

我之所以选择
多处理
而不是
线程
,是因为
多处理
使您能够实际并行运行任务,而
线程
在I/O任务中主要为您提供优势


编辑:还请记住,
如果在windows系统上,
多处理
必须使用
才能工作。

假设我在“code”文件夹中有4个python脚本,那么这个代码段如何知道process1必须在file1.py上工作,process2必须在file2.py上工作,等等……您必须选择。首先:生成一个包含该路径中所有python文件的列表,将每个进程中的列表分成4部分(核心数),并在
数据包中传递一个额外的标志,该标志指示要运行的子列表的索引。第二:在将列表传递给流程之前,先拆分列表,并且
数据包中的每个列表都包含所需的子列表。(这可能是更快的变体)如何提供数百个python文件的路径?您已经能够加载这些python文件了,是吗?类似于
path=glob.glob('/users/Aditya/workspace/codes/'+'*.py')
的东西应该可以工作。现在
path
包含该文件夹中每个.py文件的路径。现在,您可以使用如下函数轻松拆分该列表:
def split_list(alist,wanted_parts=1):length=len(alist)return[alist[i*length//wanted_parts:(i+1)*length//wanted_parts]for i in range(wanted_parts)]
无需拆分
列表
multiprocessing.map(…
默认情况下执行此操作。