对于具有许多参数的函数,包括位置和关键字参数。如何在不重复以前的关键字参数的情况下为关键字参数指定列表?
例如
import multiprocessing
from functools import partial
def foo(a, b, c=1, d=2, e=3):
print(multiprocessing.current_process().name)
print(a + b + c + d + e)
return a + b + c + d + e
with multiprocessing.Pool(processes=2) as pool:
# I would like to give [1,2,3,4] to "e", something like
# dic = {'e': [1,2,3,4]}
# Yet we still have c = 1, d = 2.
results = pool.map(partial(foo, 2, 3), dic)
参数列表可能很长,我不想键入";c=1、d=2";在每个偏函数中。
我知道使用multiprocessing.apply
是可能的,但我希望与该函数的其他用法保持一致,并且只使用map
。
我认为您将需要某种包装器函数,因为用partial
填充关键字参数似乎是不可能的。最常见的情况是,您可以有一个调用方函数,它接受(function,args,kwargs(的元组,并将该通用调用方和这样的3元素元组列表传递给pool.map
:
import multiprocessing
from functools import partial
def foo(a, b, c=1, d=2, e=3):
print(multiprocessing.current_process().name)
print(a, b, c, d, e, a + b + c + d + e)
return a + b + c + d + e
def generic_caller(tup):
func, args, kwargs = tup
return func(*args, **kwargs)
with multiprocessing.Pool(processes=2) as pool:
tups = [(foo, [2, 3], {'e': val})
for val in [1, 2, 3, 4]]
results = pool.map(generic_caller, tups)
print(results)
这给出了以下内容(注意,我在foo
内的print
语句中添加了各个变量(:
ForkPoolWorker-2
2 3 1 2 1 9
ForkPoolWorker-2
2 3 1 2 2 10
ForkPoolWorker-2
2 3 1 2 4 12
ForkPoolWorker-1
2 3 1 2 3 11
[9, 10, 11, 12]
或者,您可能更喜欢在包装器中对func
和/或args
进行硬编码,并从传递的元组中省略任何硬编码项。
不幸的是,使用闭包作为包装函数(以避免每次都必须传递相同的a
和b
值(的解决方案遇到了不可拾取的问题,因此可以使用map
,但不能使用pool.map
。