Python multiprocessing.Pool map() “类型错误:字符串索引必须是整数,而不是字符串”
我正在尝试使用multiprocessing.Pool来对一个字典列表进行并行处理。下面是一个示例:
(请注意: 这是一个简单的示例,我实际的例子会对字典中的值进行大量的计算处理)
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函数的方式才能让它正常运行?
1 个回答
8
pool.map()
是一个函数,它接收一个可调用对象(比如一个函数)和一个可迭代对象(比如一个列表),然后会把这个可调用对象应用到可迭代对象中的每一个元素上。它会把工作分配给多个工作进程,但每次只会把一个元素传给这个函数。
你传入的是一个字典的列表,这意味着每次调用 process_list()
时,只会传递一个字典:
process_list({'letter': 'a'})
process_list({'letter': 'b'})
# etc.
不过你的代码把 list_elements
当成了一个列表来处理。这个 for
循环:
for my_dict in list_elements:
实际上是把字典的键一个一个地取出来。对于你的字典来说,这意味着只会进行一次循环,每次 my_dict
都会被设置为 'letter'
。所以这一行:
my_dict['letter']
试图去索引这个字符串,而 'letter'['letter']
就会抛出你看到的那个异常。
下面的代码可以正常工作:
def process_list(list_element):
return list_element['letter']
你会返回一个结果;map()
会把所有结果收集到一个新的列表中,并在所有工作完成后返回这个列表。