关于并行处理:如何使用多个参数并行化一个简单的python def

how do I parallelize a simple python def with multiple argument

本问题已经有最佳答案,请猛点这里访问。

我想并行化一个Python脚本。我已经创建了一个定义:

1
2
def dummy(list1,list2):
  do usefull calculations ...

列表1和列表2包含一个文件名列表,我应该读取这些文件名,然后用它们进行计算。这些文件是独立的。列表1和2包含相同数量的参数。

假设我有两个CPU(我想强制使用CPU的数量)。我希望第一个CPU使用仅包含列表1和列表2前半部分的列表调用定义,同时第二个CPU应使用列表1和列表2后半部分调用相同的def dummy。

比如:

1
2
3
4
5
6
7
import multiprocessing
nb_cpus = 2
pool = multiprocessing.Pool(processes=nb_cpus)
for ii in nb_cpus:
  list_half1 = list1[0:max/nb_cpus]
  list_half2 = list2[0:max/nb_cpus]
  result[ii] = pool.map(dummy,list_half1,list_half2)

问题是pool.map只能在def有1个参数并且我不能循环CPU的情况下工作。

谢谢你对那个问题的帮助!

附:我不可能把两个参数连接成一个,因为在实际情况下,我要传递更多的参数。


首先,你不需要自己去划分你的列表,multiprocessing.Pool会帮你做的。

要将许多参数作为单个参数传递给函数,只需将列表压缩在一起,如下所示:

1
2
3
4
5
6
7
8
9
import multiprocessing

def myFunction(arguments):
    item1, item2 = arguments
    ...

nb_cpus = 2
pool = multiprocessing.Pool(processes=nb_cpus)
results = pool.map(myFunction, zip(list1, list2))