Python多处理池传递函数参数

Cla*_*u S 1 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)
Run Code Online (Sandbox Code Playgroud)

我试过用过

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

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

感谢你的帮助!

干杯

dan*_*ano 5

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

method(var1)
method(var2)
method(var3)
...
method(var16)
Run Code Online (Sandbox Code Playgroud)

我想你想要做的是:

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()
Run Code Online (Sandbox Code Playgroud)

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

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