您是正确的,它们在您的示例中按顺序执行。
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(同时存储结果,但每次一次)添加到结果中您会在构建时清除它)。这样一来,存储时间就不会超过添加到结果中所需的时间。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)