如何将args和kwargs传递到多处理池?

时间:2019-01-03 21:17:55

标签: python python-3.x multiprocessing

如果我具有以下功能:

def foo(a, b, c=2, d=6):
    return a + b + c + d

,我想与multiprocessing并行化。

如何传递以下参数1, 2, d=10?即2 args和1 kwarg

我看到了this个帖子,但实际上并没有使它平行。 here提供了另一个可能有用的示例,但是很难解开。

2 个答案:

答案 0 :(得分:1)

怎么样:

import multiprocessing

def foo(a, b, c=2, d=6):
    return a + b + c + d

def foo_callback(result):
    print(result)

def foo_error(error):
    raise error

pool = multiprocessing.Pool()

for (a, b, c, d) in ((1, 2, 3, 4),
                     (2, 4, 6, 8),
                     (3, 6, 9, 12)):
    pool.apply_async(
        foo,
        args=(a, b),
        kwds={"c":c, "d":d},
        callback=foo_callback,
        error_callback=foo_error
    )
pool.close()
pool.join()

哪些印刷品:

10
20
30

Process finished with exit code 0

我猜你想通过kwds作为命令。密钥必须是字符串。

答案 1 :(得分:1)

使用mapimap或这两个功能的异步功能会更简单。

from multiprocessing import Pool

def foo(args):
    a, b, c, d = args
    return a + b + c + d # or just sum(args)

with Pool(processes=80) as pool:
    iter = ((1, 2, 3, 4), (2, 4, 6, 8), (3, 6, 9, 12))
    results = pool.map(foo, iter)

print(results)