我正在尝试使用multiprocessing.Pool对字典列表进行并行处理。一个例子如下
(请注意:这是一个玩具示例,我的实际示例将对实际字典中的值进行cpu密集处理)
import multiprocessing
my_list = [{'letter': 'a'}, {'letter': 'b'}, {'letter': 'c'}]
def process_list(list_elements):
ret_list = []
for my_dict in list_elements:
ret_list.append(my_dict['letter'])
return ret_list
if __name__ == "__main__":
pool = multiprocessing.Pool()
letters = pool.map(process_list, my_list)
print letters
如果我运行上面的代码,我会收到以下错误:
Traceback (most recent call last):
File "multiprocess_fail.py", line 13, in <module>
letters = pool.map(process_list, my_list)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 250, in map
return self.map_async(func, iterable, chunksize).get()
File "/usr/lib/python2.7/multiprocessing/pool.py", line 554, in get
raise self._value
TypeError: string indices must be integers, not str
我不知道它指的是什么字符串索引。不应该pool.map
只是迭代my_list
中的项目(即字典)吗?我是否必须更改数据传递给map函数的方式才能使其运行?
答案 0 :(得分:7)
pool.map()
采用可调用和可迭代,然后继续将可调用应用于iterable
中的每个元素。它将以池为单位划分池工作者的工作,但该函数一次只能传递一个元素。
您传入了词典列表,这意味着每个process_list()
都会传递一个词典:
process_list({'letter': 'a'})
process_list({'letter': 'b'})
# etc.
然而,您的代码将list_elements
视为列表。 for
循环:
for my_dict in list_elements:
而是看到字典键,每个my_dict
一次绑定到一个键。对于您的词典,这意味着有一次迭代,my_dict
每次都设置为'letter'
。这一行:
my_dict['letter']
然后尝试索引到该字符串,'letter'['letter']
抛出您看到的异常。
以下作品:
def process_list(list_element):
return list_element['letter']
您将返回一个结果; map()
将所有结果收集到一个新列表中,并在所有工作完成后返回。