Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python多处理中指定某个关键字参数_Python_Multiprocessing_Keyword Argument - Fatal编程技术网

如何在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]