多处理:将数组列表传递(和迭代)到池映射
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多处理池:我怎么知道池中的所有工作人员何时完成?