具有部分参数的Python多处理池

时间:2017-08-28 05:54:46

标签: python multiprocessing closures

所以我试着按照这里的例子: Python multiprocessing pool.map for multiple arguments

如果我有三个参数并且我需要将第三个固定为一个值,例如像这样的东西,但它不起作用。提出TypeError,说partial_merge()只需要2个参数,但只有1个参数。

import multiprocessing
from functools import partial


def merge_names(a, b, c):
    return '{} & {} & {}'.format(a, b, c)


if __name__ == '__main__':
    names = [('Brown', 'Wilson'), ('Bartlett', 'Rivera'), ('Molloy', 'Opie')]
    pool = multiprocessing.Pool(processes=3)

    results = pool.map(partial(merge_names, c='Hello'), names)
    pool.close()
    pool.join()
    print(results)

1 个答案:

答案 0 :(得分:1)

pool.map()的工作方式类似于'normal'map():它接受一个缺少参数和列表的函数,并将函数应用于列表的每个元素。解决问题的最简单方法是修改你的功能:

def merge_names(tup, c):
    a, b = tup
    return '{} & {} & {}'.format(a, b, c)

根据您的目标/设置,还有其他可能性(复杂性增加):

  1. 闭包。例如:

    def func(x):
        return x + y
    
    def main():
        y = 5  # the point is to declare this BEFORE Pool() is initiated
        p = mp.Pool(3)
        data = range(10)
        results = p.map(func, data)
    
  2. 共享值:请参阅documentation on sharing state

  3. 队列和管道:请参阅documentation on queues and pipes

  4. 不使用游泳池而是使用mp.Process(),这样可以更好地控制参数等等。