我正在尝试multiprocessing
模块。考虑以下代码:
import multiprocessing
#simple function
def f(x):
return x**2
S = 0
#create workers
pool = multiprocessing.Pool(15)
#outer loop
for x_min in range(20):
results = []
for x in xrange(x_min, x_min+15):
#new process for each x value
results.append(pool.apply_async(f, args=(x,)))
#is it guaranteed that processes will join here?
S = S+sum([res.get() for res in results])
print S
这个想法是我有一个外循环,其中有一个内循环。内部循环为一系列f(x)
值调用函数x
,我想将这些调用分配给单独的进程,以便并行执行它们。但是,外循环中的后续迭代取决于先前的结果,因此外循环无法并行化。
我的问题是:在计算sum
之前,是否可以保证15个进程在外循环的每次迭代中都互相等待?换句话说,严格地讲,上面的代码是否始终等同于简单地调用f(x)
而不是apply_async
?
更笼统地说,是在get()
的结果上调用apply_async
函数总是要等到返回所有过程的结果吗?