让我们看一下代码的两部分。
首先是sumifs
函数声明:
def sumifs(df, result_col, **kwargs):
其次,调用该函数时带上相关参数。
# Those are the params
ca = read_in_table('Tab1')
keywords = {'Z': base['Consumer archetype ID']}
# This is the function call
results = pool.map(partial(sumifs, a=ca, kwargs=keywords), tasks)
更新1:
编辑原始代码后。看起来问题是位置参数分配,尝试丢弃它。
替换行:
results = pool.map(partial(sumifs, a=ca, kwargs=keywords), result_col)
with:
results = pool.map(partial(sumifs, ca, **keywords), result_col)
示例代码:
import multiprocessing
from functools import partial
def test_func(arg1, arg2, **kwargs):
print(arg1)
print(arg2)
print(kwargs)
return arg2
if __name__ == '__main__':
list_of_args2 = [1, 2, 3]
just_a_dict = {'key1': 'Some value'}
with multiprocessing.Pool(processes=3) as pool:
results = pool.map(partial(test_func, 'This is arg1', **just_a_dict), list_of_args2)
print(results)
将输出:
This is arg1
1
{'key1': 'Some value'}
This is arg1
2
{'key1': 'Some value'}
This is arg1
2
{'key1': 'Some value'}
['1', '2', '3']
有关如何操作的更多示例Multiprocessing.pool 具有多个 args 和 kwargs 的函数 https://stackoverflow.com/questions/59756754/multiprocessing-pool-with-a-function-that-has-multiple-args-and-kwargs/59775559?noredirect=1#comment105779457_59775559
更新2:
扩展示例(由于评论):
然而,我想知道,以同样的方式,如果我的函数有三个 args 和 kwargs,并且我想保持 arg1、arg3 和 kwargs 恒定,我如何将 arg2 作为多处理列表传递?本质上,我将如何指示映射(partial(test_func,'这是arg1','这将是arg3',** just_a_dict),arg2)的多重处理,partial中的第二个值对应于arg3而不是arg2?
The Update 1代码将更改如下:
# The function signature
def test_func(arg1, arg2, arg3, **kwargs):
# The map call
pool.map(partial(test_func, 'This is arg1', arg3='This is arg3', **just_a_dict), list_of_args2)
这可以使用 python 来完成位置和关键字分配。
请注意,kwargs
被放在一边并且没有使用 a 进行分配keyword尽管事实上它位于keyword指定值。
有关参数分配差异的更多信息可以找到here https://stackoverflow.com/questions/9450656/positional-argument-v-s-keyword-argument.