使用Python进行多处理:如何并行化嵌套循环并将结果附加到字典?

时间:2018-07-07 01:04:52

标签: python python-multiprocessing multiprocess

我是使用Python进行多处理的新手,目前不确定如何处理该问题。我正在尝试实现一个具有两个循环(内部和外部循环)的函数,并将结果附加到字典中。该功能以及我想要实现的功能类似于:

def func(p, a):
    return p*a

p_dict = dict()
for p in all_possible_ps:    #I would like to parallelize this
    alist = list()

    for a in all_possible_as:    #And this for loop
        alist.append(func(p,a))

    p_dict[p] = alist

对于内部循环,我相信我可以实例化一个池p=Pool(),然后实例化p.map(func, all_possible_as)以获得alist。我不确定如何并行化两个循环,并同时分配两个循环的进程数。

2 个答案:

答案 0 :(得分:1)

您可以使用两个不同的池,然后将它们嵌套。在这里,我使用的是client_type(它包括pathos的一个分叉,具有必要的序列化,以便在池中传递lambda)。

如果您查看一个具有两个变量功能的for循环,您会想到这种进展...

multiprocessing

平行嵌套:

>>> doit = lambda x,y: x*y
>>> a = [0,1,2,3]
>>> b = [9,8,7,6]
>>> [[doit(i,j) for j in b] for i in a]
[[0, 0, 0, 0], [9, 8, 7, 6], [18, 16, 14, 12], [27, 24, 21, 18]]

>>> from pathos.pools import ThreadPool, ProcessPool >>> p = ProcessPool() >>> t = ThreadPool() >>> foo = lambda x,y: p.map(doit, [x]*len(y), y) >>> t.map(foo, a, [b]*4) [[0, 0, 0, 0], [9, 8, 7, 6], [18, 16, 14, 12], [27, 24, 21, 18]] 只是一个地图迭代器。如果愿意,可以使用imap,但下面将使用map。我相信您正在寻找的功能具体如下:

imap

答案 1 :(得分:0)

这是一种简单的方法。如果您使用的是Python 2.7,则可以改用multiprocessing.Pool

from concurrent.futures import ProcessPoolExecutor

p_dict = {}

# submit jobs
with ProcessPoolExecutor() as pool:
    for p in all_possible_ps:
        p_dict[p] = [pool.submit(func, p, a) for a in all_possible_as]

# collect results
for p, alist in p_dict.items():
    for ii, fut in enumerate(alist):
        alist[ii] = fut.result()