我试图使用常量参数和不同的参数多处理函数。
我已经尝试创建一个大的iterable,它将常量参数附加到不同的参数并将其传递给Pool.starmap(),但这看起来很混乱。
from multiprocessing import Pool
import itertools
def combine_iterables(foo, bar, iterable_list):
foobar = (foo, bar)
arg_list = list(itertools.product(*iterable_list))
for i in range(len(arg_list)):
arg_list[i] = foobar+arg_list[i]
return arg_list
# Returns [('foo', 'bar', 10, 140), ('foo', 'bar', 10, 150)...]
def process(foo, bar, small=[10,20,30], big=[140, 150, 160]):
iterable_list = [small,big]
p = Pool()
data = p.starmap(
func,
combine_iterables(foo,bar,iterable_list)
)
p.close()
p.join()
def func(foo, bar, small, big):
#Do Stuff
这种方法有效,但感觉非常混乱,我想知道是否有更好的方法吗?
这可以通过functools.partial
轻松完成
from multiprocessing import Pool
import itertools
import functools
def func(foo, bar, small, big):
return [foo, bar, small, big]
def process(foo, bar, small=[10,20,30], big=[140, 150, 160]):
iterable_list = [small,big]
p = Pool()
data = p.starmap(
functools.partial(func, foo, bar),
itertools.product(*iterable_list)
)
p.close()
p.join()
print(data)
if __name__ == '__main__':
process('foo', 'bar')
您可以使用functools.partial
创建一个为另一个函数提供默认参数的函数:
from functools import partial
def process(foo, bar, small=[10,20,30], big=[140, 150, 160]):
iterable_list = [small,big]
with Pool() as p:
data = p.starmap(partial(func, foo, bar), product(*iterable_list))