具有多个参数的 MultiProcess 函数

Posted

技术标签:

【中文标题】具有多个参数的 MultiProcess 函数【英文标题】:MultiProcess function with multiple arguments 【发布时间】:2020-08-29 02:29:07 【问题描述】:

我正在深入研究 python 中的多处理世界。

看了一些视频后,由于我的职能性质,我想出了一个问题。

这个函数有 4 个参数:

    第一个参数是要读取的文件,因此,这是要读取的文件列表。 以下 2 个参数是两个不同的字典。 最后一个参数是可选参数“debug_mode”,需要设置为“True”
# process_data(file, signals_dict, parameter_dict, debug_mode=False)
file_list = [...]
t1 = time.time()
with concurrent.futures.ProcessPoolExecutor() as executor:
    executor.map(process_data, file_list)
t2 = time.time()

问题是: 如何为函数指定剩余的参数?

提前致谢

【问题讨论】:

有了这样简单的例子,为什么不发布一些我们可以复制和运行的东西呢? 我拥有的功能很长。原则上,我感兴趣的是如何使用参数设置函数以使用 executor.map。 对。所以你编写了一个非常小的测试程序。你的工人可能是def worker(a,b,c,d): print(os.getpid(), a, b, c, d)。您感兴趣的问题 - 如何映射具有多个参数的函数 - 是十几行。 除了 ProcessPoolExecutor.map 之外还有其他方法可以实现目标吗? map 对我来说似乎是完成这项工作的工具。如果字典很大,则将其传递给孩子可能会出现性能问题(在 Windows 上有一个副本,在 linux 上,您可以通过将 dict 放在全局变量中来利用父内存空间的写时复制视图)。 【参考方案1】:

您需要为每个进程创建一个包含参数的列表列表:

params_list = [[file1, dict1_1, dict2_1, True],
               [file2, dict1_2, dict2_2, True],
               [file3, dict1_3, dict2_3]]

然后,您可以像这样创建流程:

executor.map(process_data, params_list)

【讨论】:

这还不是全部。它没有很好的文档记录,但目标函数采用单个参数。如果process_data 需要 4,您需要一个中间函数来为您解包它们。此外,如果您不等待map 完成而只是退出with 子句,则工作将被取消。 result = executor.map(process_data_caller, params_list) 更好。 我在 executor.map 中只放了一个函数参数,尽管它需要四个,因为我看过的例子就是这样。你能解释一下中间函数是什么意思,以及如何实现你建议的解包?【参考方案2】:

ProcessPoolExecutor.map 文档薄弱。 worker 接受一个参数。如果您的目标具有不同的调用签名,则需要编写一个中间工作程序,该工作程序传递一个容器并知道如何将其扩展到参数列表中。该文档也未能明确说明您需要等待作业完成才能关闭池。如果您启动作业并退出池上下文with 子句,则池终止。

import concurrent.futures
import os

def process_data(a,b,c,d):
    print(os.getpid(), a, b, c, d)
    return a

def _process_data_worker(p):
    return process_data(*p)

if __name__ == "__main__":
    file_list = [["fooa", "foob", "fooc", "food"],
        ["bara", "barb", "barc", "bard"]]

    with concurrent.futures.ProcessPoolExecutor() as executor:
        results = executor.map(_process_data_worker, file_list)

for result in results:
    print('result', result)

【讨论】:

有什么打印出来的吗?它适用于我在 Ubuntu 上。它非常基本,应该可以在任何地方使用。 我在 jupyter 上测试过。我稍后会在pycharm上尝试。顺便说一句,我是 Windows 用户。 有趣。值得将环境(windows上的jupyter)添加到问题中。多处理并不倾向于在交互式 shell 中工作,尤其是在需要在子进程中重新导入模块的窗口上。我不具体了解 jupyter,但搜索“jupyter windows 中的多进程”有很多点击率。一击说如果您在导入的模块中而不是主脚本中有 MP 东西,它就可以工作。 我尝试了 Jupiter,但我正在 Pycharm 中开发 :) 稍后我会尝试一下。感谢您的回答

以上是关于具有多个参数的 MultiProcess 函数的主要内容,如果未能解决你的问题,请参考以下文章

Python multiprocess模块

multiprocess模块补充

Python之路-进程

创建多进程之multiprocess包中的process模块

为什么Python multiprocess.Process调用在应用程序中启动多个self实例?

返回具有多个输入参数的函数的值以在同一类中具有多个参数的另一个函数中使用?