解压字典字典参数,并在多处理池中使用**kwargs

Unpacking a dictionary dictionary parameter, and using **kwargs in mutiprocessing pool

全部!

通常,如果我需要将字典作为参数集传递给函数,一种简单的方法是解压字典并使用它们。

def some_function(a=0, b=0, **params):
    print(a) # 1
    print(b) # 2

d = {"a":1, "b":2}
some_function(**d)

我正在做一个需要很长时间的小项目。所以,我试图使用 Multiprocessing 来帮助我更快地完成工作。我简化了我的代码(如下)。

from multiprocessing import Pool
from itertools import repeat
import time

def some_function(n, param1=0, param2=0):
    #some operation on n and **params
    print(n)
    print(param1)

input_k = [i for i in range(1,10,2)]
input_params = {'param1':1, 'param2':1}

if __name__ == '__main__':
    with Pool(16) as p:
        k = p.starmap(some_function, zip(input_k, repeat(input_params)))

############## output ##############
#1
#7
#9
#5
#3
#{'param1': 1, 'param2': 1}
#{'param1': 1, 'param2': 1}
#{'param1': 1, 'param2': 1}
#{'param1': 1, 'param2': 1}
#{'param1': 1, 'param2': 1}

我想运行那个some_function就对应input_kinput_params。但是函数的输出并不像预期的那样。看起来该函数采用整个 input_params 字典并将其分配给函数中的 param1?

我知道我在将它传递给函数时没有解压字典,但我不知道该怎么做(zip() 不允许我简单地添加“**” the input_param)。我该怎么做?

谢谢!

我将您的代码修改为:

from multiprocessing import Pool
from itertools import repeat
import time

def some_function(n, param1=0, param2=0):
    #some operation on n and **params
    print(n, param1, param2)

input_k = [i for i in range(1,10,2)]
input_params = {'param1':1, 'param2':1}

if __name__ == '__main__':
    with Pool(16) as p:
        k = p.starmap(some_function,  [[x,*y.values()] for x,y in zip(input_k, repeat(input_params))])

现在工作正常。