您是正确的,它们在您的示例中按顺序执行。
p.join()
导致当前线程阻塞,直到完成执行。您可能想在for循环之外单独加入您的进程(例如,通过将它们存储在列表中,然后对其进行迭代),或使用类似numpy.Pool
和apply_async
的回调函数。这样一来,您也可以直接将其添加到结果中,而无需保留对象。
例如:
def f(i):
return i*np.identity(4)
if __name__ == '__main__':
p=Pool(5)
result = np.zeros((4,4))
def adder(value):
global result
result += value
for i in range(30):
p.apply_async(f, args=(i,), callback=adder)
p.close()
p.join()
print result
最后关闭并再加入池可确保池的进程已完成,并且result
对象的计算已完成。您也可以调查将其Pool.imap
用作解决问题的方法。该特定解决方案如下所示:
if __name__ == '__main__':
p=Pool(5)
result = np.zeros((4,4))
im = p.imap_unordered(f, range(30), chunksize=5)
for x in im:
result += x
print result
这对于您的特定情况比较干净,但对于最终尝试执行的操作可能不是这样。
至于存储所有变化的结果,如果我理解您的问题,您可以将其添加到回调方法(如上)中或使用imap
/imap_unordered
(同时存储结果,但每次一次)添加到结果中您会在构建时清除它)。这样一来,存储时间就不会超过添加到结果中所需的时间。