我是使用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
。我不确定如何并行化两个循环,并同时分配两个循环的进程数。
答案 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()