Python multiprocessing.Pool map() “类型错误:字符串索引必须是整数,而不是字符串”

5 投票
1 回答
7375 浏览
提问于 2025-04-17 22:20

我正在尝试使用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() 会把所有结果收集到一个新的列表中,并在所有工作完成后返回这个列表。

撰写回答