【问题标题】:Multiprocessing a python method多处理一个python方法
【发布时间】:2017-07-20 07:55:32
【问题描述】:

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

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

我应该如何编写方法来执行此操作,以便我的方法知道它必须处理脚本的哪个部分?

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

'name_prefix' 可以是 /users/Aditya/workspace/codes/ 其中 'codes' 包含所有 python 脚本。

【问题讨论】:

    标签: python multiprocessing


    【解决方案1】:

    你可以这样做:

    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 的使用率。

    我之所以选择multiprocessing 而不是threads 的原因是multiprocessing 使您能够实际并行运行任务,而threads 主要为您提供I/O 任务的优势。

    编辑:还请记住,if __name__ == "__main__": 在 Windows 系统上是必需的,multiprocessing 才能正常工作。

    【讨论】:

    • 假设我在'codes'文件夹中有4个python脚本,这个sn-p怎么知道process1必须在file1.py上工作,process2在file2.py上工作,等等......
    • 你必须选择。首先:您生成一个包含该路径中所有 python 文件的列表,将每个进程中的列表拆分为 4 部分(您的核心数),并在 data_pack 中传递一个附加标志,该标志指示您要运行的子列表索引。第二:在将列表传递给进程之前拆分列表,data_pack 中的每个列表都包含所需的子列表。 (这可能是更快的变体)
    • 如何提供数百个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)]
    • 默认情况下不需要拆分listmultiprocessing.map(...这样做。 This method chops the iterable into a number of chunks which it submits to the process pool as separate tasks
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2018-08-09
    • 2015-05-21
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多