在嵌套循环中使用multiprocessor.Pool的正确方法

时间:2013-12-04 22:32:39

标签: python parallel-processing

我正在使用multiprocessor.Pool()模块来加速"令人尴尬的并行"环。我实际上有一个嵌套循环,并使用multiprocessor.Pool加速内循环。例如,如果没有并行化循环,我的代码将如下:

outer_array=[random_array1]
inner_array=[random_array2]
output=[empty_array]    

for i in outer_array:
    for j in inner_array:
        output[j][i]=full_func(j,i)

使用并行化:

import multiprocessing
from functools import partial

outer_array=[random_array1]
inner_array=[random_array2]
output=[empty_array]    

for i in outer_array:
    partial_func=partial(full_func,arg=i)     
    pool=multiprocessing.Pool() 
    output[:][i]=pool.map(partial_func,inner_array)
    pool.close()

我的主要问题是,如果这是正确的,我应该在循环中包含multiprocessing.Pool(),或者如果我应该在循环外创建池,即:

pool=multiprocessing.Pool() 
for i in outer_array:
     partial_func=partial(full_func,arg=i)     
     output[:][i]=pool.map(partial_func,inner_array)

另外,我不确定是否应该包含" pool.close()"在上面第二个例子的每个循环结束时;这样做有什么好处?

谢谢!

3 个答案:

答案 0 :(得分:25)

理想情况下,您应该恰好调用Pool()构造函数一次 - 而不是在&再次。创建工作进程时会产生大量开销,并且每次调用Pool()时都要支付这些费用。单个Pool()电话创建的流程仍然存在!当他们完成你在程序的一部分给他们的工作时,他们会坚持下去,等待更多的工作。

至于Pool.close(),你应该在 - 当且 - 你永远不会向Pool实例提交更多工作时调用它。因此,当主程序的可并行化部分完成时,通常会调用Pool.close()。然后,当已经分配的所有工作都已完成时,工作进程将终止。

调用Pool.join()等待工作进程终止也是一种很好的做法。除了其他原因之外,通常没有好的方法来报告并行化代码中的异常(异常发生在上下文中,与主程序的作用有些模糊),Pool.join()提供了一个可以报告发生的异常的同步点在工作流程中你从未见过。

玩得开心: - )

答案 1 :(得分:0)

import itertools
import multiprocessing as mp

def job(params):
    a = params[0]
    b = params[1]
    return a*b

def multicore():
    a = range(1000)
    b = range(2000)
    paramlist = list(itertools.product(a,b))
    print(paramlist[0])
    pool = mp.Pool(processes = 4)
    res=pool.map(job, paramlist)
    for i in res:
        print(i)

if __name__=='__main__':
    multicore()

怎么样?

答案 2 :(得分:0)

import time
from pathos.parallel import stats
from pathos.parallel import ParallelPool as Pool


def work(x, y):
    return x * y


pool = Pool(5)
pool.ncpus = 4
pool.servers = ('localhost:5654',)
t1 = time.time()
results = pool.imap(work, range(1, 2), range(1, 11))
print("INFO: List is: %s" % list(results))
print(stats())
t2 = time.time()
print("TIMER: Function completed time is: %.5f" % (t2 - t1))