具有多个参数的 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 函数的主要内容,如果未能解决你的问题,请参考以下文章
创建多进程之multiprocess包中的process模块