如何在Python多处理中指定某个关键字参数
对于具有多个参数的函数,包括位置参数和关键字参数。如何在不重复以前的关键字参数的情况下为关键字参数指定列表 例如如何在Python多处理中指定某个关键字参数,python,multiprocessing,keyword-argument,Python,Multiprocessing,Keyword Argument,对于具有多个参数的函数,包括位置参数和关键字参数。如何在不重复以前的关键字参数的情况下为关键字参数指定列表 例如 导入多处理 从functools导入部分 def foo(a、b、c=1、d=2、e=3): 打印(多处理。当前进程()。名称) 打印(a+b+c+d+e) 返回a+b+c+d+e 将multiprocessing.Pool(processs=2)作为池: #我想把[1,2,3,4]给“e”,类似于 #dic={'e':[1,2,3,4]} #但我们仍然有c=1,d=2。 结果=池图
导入多处理
从functools导入部分
def foo(a、b、c=1、d=2、e=3):
打印(多处理。当前进程()。名称)
打印(a+b+c+d+e)
返回a+b+c+d+e
将multiprocessing.Pool(processs=2)作为池:
#我想把[1,2,3,4]给“e”,类似于
#dic={'e':[1,2,3,4]}
#但我们仍然有c=1,d=2。
结果=池图(部分(foo,2,3),dic)
参数列表可能很长,我不想在每个分部函数中键入“c=1,d=2”
我知道可以使用
多处理。apply
,但我希望与此函数的其他用法保持一致,并且只使用map
。我认为您将需要某种包装函数,因为似乎用部分
填充关键字参数。在最一般的情况下,您可以拥有一个调用方函数,该函数接受(function、args、kwargs)的元组,并传递给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
语句中添加了各个变量):
或者您可能更喜欢在包装中硬编码func
和/或args
,并从传递的元组中省略任何硬编码项
不幸的是,涉及使用闭包作为包装函数的解决方案(为了避免每次都必须传递相同的
a
和b
值)遇到了不可拾取的问题,因此可以使用map
而不是pool。map
是否总是相同的关键字(也就是说,'e'
可以硬编码吗)或者可能会有所不同吗?不,它不能硬编码,这让我有点困难..接受。谢谢!我猜在通用调用方
中,您的意思是返回函数(*args,**kwargs)我必须承认,我一开始试图写一个闭包来解决这个问题,然后遇到了一个不可挑选的问题——因此最后一段。
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]