对具有可迭代和!iterable参数的函数进行多处理

时间:2019-04-05 13:22:57

标签: python

我正在尝试对具有恒定参数以及可变参数的函数进行多处理。

我尝试创建一个大的可迭代对象,该常量将常量参数附加到变化的参数上,并将其传递给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

此方法有效,但感觉确实很乱,我想知道是否有更好的方法?

2 个答案:

答案 0 :(得分:2)

您可以使用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))

答案 1 :(得分:1)

使用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')