Python multiprocessing.Pool map()" TypeError:字符串索引必须是整数,而不是str"

时间:2014-03-14 17:04:39

标签: python multiprocessing

我正在尝试使用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函数的方式才能使其运行?

1 个答案:

答案 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()将所有结果收集到一个新列表中,并在所有工作完成后返回。