multiprocessing Pool.map函数问题

4 投票
1 回答
5263 浏览
提问于 2025-04-18 15:37

我有一个函数,下面是它的样子,它需要一个列表和一个路径:

def my_function(items_list,directory):
     return(resulting number  of analyzing items_list for example [a,b] using specific file for example 'c:\\path')

为了进行并行计算,我使用了 multiprocessing 模块,代码如下:

from multiprocessing import Pool
def test_func(objs):
 pool= Pool(8) 
 result=pool.map(my_function,objs)
 return(result)


if __name__=='__main__':
    objects=[([a,b],'path1',),([c,d],'path2',),.....]
    result=test_funct(objects)

但是它给了我以下错误信息: TypeError: my_function() 缺少一个必需的位置参数:'directory'

我尝试了好几次更改对象列表的格式,但还是出现同样的错误。 有没有人知道问题出在哪里? (我在 Windows 7 上使用的是 Python 3.3)

1 个回答

10

multiprocessing.map 不会自动拆分你元组里的变量。所以 myfunction 只会接收到一个元组作为参数,而不是一个列表和一个字符串。

如果你使用的是 Python 3.3 及以上版本(看起来你是),你可以使用 starmap,这个方法会自动展开元组:

 result = pool.starmap(my_function,objs)

如果你使用的是 Python 3.2 或更早的版本,最简单的方法就是让 my_function 只接收一个参数,然后在函数内部展开这个元组:

def my_function(tup)
    items_list, directory = tup

如果你不能修改 my_function,可以添加一个辅助函数来帮你拆分元组:

def my_function_helper(tup):
    return my_function(*tup)

撰写回答