多处理:将数组列表传递(和迭代)到池映射

Posted

技术标签:

【中文标题】多处理:将数组列表传递(和迭代)到池映射【英文标题】:Multiprocessing: Passing (and iterating) a list of arrays to pool map 【发布时间】:2020-07-24 22:23:24 【问题描述】:

我一直在尝试将字符串传递给函数。

例如,对于 input_list_1,我发现函数的返回部分正确 - 只有与处理器数量匹配的第一个 n 是正确的。其余输出不正确。我尝试了 chunksize 输入和 map_async 但没有运气。

pool = mp.Pool(processes=2)
input_list_1=['string1','string2','string3','string4']
results=pool.map(somefunction, input_list_1)

但是,当我打破 input_list_2 中所示的输入(每个数组与处理器数量匹配)并将 input_list_2[0] 和 input_list_2[1] 作为单独的参数传递时,我发现函数的返回更可预测并且匹配我的期望。

有没有办法将 input_list_2 作为参数传递并进行某种类型的迭代?我已经尝试了所有我能找到的与可迭代对象相关的东西 - imap、map_async、starmap。

pool = mp.Pool(processes=2)
input_list_2=[('string1','string2'),('string3','string4')]
results=pool.map(somefunction, input_list_2)

【问题讨论】:

somefuction 只处理字符串而不处理元组。您将每个元组发送到somefunction 而不是每个string。不要担心划分你的列表。这就是 map 的用途,在 string1 或 string2 完成之前它不会开始处理 string3 【参考方案1】:

你可能有这样的事情:

def somefunc(str):
   ##string specific method
   print(str.strip())

pool = mp.Pool(processes=2)
input_list=['string1 ','string2 ','string3 ','string4']
pool.map(somefunction, input_list)

string1
string2
string3
string4

map 会将迭代中的每个字符串发送到 somefunc。

但是,当您将列表分成两个元组时:

input_list_2=[('string1','string2'),('string3','string4')]

它将元组 ('string1','string2') 作为参数发送给 somefunc

如果你真的想这样分块,你的函数必须处理一个元组。

def somefunc(tuple):
   ##string specific method
   for x in tuple:
      print(x.strip())


pool = mp.Pool(processes=2)
input_list_2=[('string1 ','string2 '), ('string3 ','string4')]
pool.map(somefunction, input_list_2)


string1
string2
string3
string4

【讨论】:

以上是关于多处理:将数组列表传递(和迭代)到池映射的主要内容,如果未能解决你的问题,请参考以下文章

python多处理池:我怎么知道池中的所有工作人员何时完成?

如何在多处理函数中传递参数以及如何使用多处理列表?

JavaScript 数据处理 - 列表篇

具有多处理功能的 Python itertools - 巨大的列表与使用迭代器的 CPU 使用效率低下

Python中的多处理:处理多个工作线程

如何使用 pybind 传递 numpy 数组列表