Python多处理池传递函数参数

时间:2014-05-06 18:02:51

标签: python multiprocessing

我有4个嵌套循环,我循环列表列表,以及我从函数中传递一些参数的函数,具体来说:

def method(var1, var2 ....., var 16):
  #computation 

pool = Pool()

for values1 in list_of_values1:
  #assign 4 variables from the list 
  for values2 in list_of_values2:
    #assign 4 variables from list 
    for values3 in list_of_values3:
      #assign 4 variables from  list 
      for values4 in list_of_values4:
        #assign 4 variables from list
        method(var1, ..., var16)

我尝试过使用

  

pool.map(method,[var1,...,var16])   为了对整个过程进行并行化,但它会抛出一个错误,说“method()只需要16个参数,1给出”

我也试过使用Threads,但它没有太大改进。

感谢你的帮助!

干杯

1 个答案:

答案 0 :(得分:5)

Pool.map旨在为您传递的迭代器中的每个值调用method作为第二个参数。因此,在您的示例中,它将尝试并行执行以下操作:

method(var1)
method(var2)
method(var3)
...
method(var16)

我认为你想要做的是:

for values1 in list_of_values1:
  #assign 4 variables from the list 
  for values2 in list_of_values2:
    #assign 4 variables from list 
    for values3 in list_of_values3:
      #assign 4 variables from  list 
      for values4 in list_of_values4:
        #assign 4 variables from list
        pool.apply_async(method, (var1, ..., var16))
pool.close()
pool.join()

这只是用它期望的16个参数调用method,但是在后台进程中执行它。

通过使用itertools构建(var1,...,var16)元组的列表,然后可以传递给pool.map,你也可以做一些比多个嵌套for循环更好的东西。 。但这取决于#assign 4 variables from list*实际做了什么。