【发布时间】:2015-10-21 01:53:56
【问题描述】:
所以我正在编写一个算法,函数multiprocess 应该在与cpus 一样多的进程上并行调用另一个函数CreateMatrixMp()。我以前从未做过多处理,并且无法确定以下哪种方法更有效。在函数CreateMatrixMp() 的上下文中使用的“高效”一词可能需要被调用数千次。我已经阅读了python multiprocessing 模块上的所有文档,并得出了这两种可能性:
首先是使用Pool类:
def MatrixHelper(self, args):
return self.CreateMatrix(*args)
def Multiprocess(self, sigmaI, sigmaX):
cpus = mp.cpu_count()
print('Number of cpu\'s to process WM: %d' % cpus)
poolCount = cpus*2
args = [(sigmaI, sigmaX, i) for i in range(self.numPixels)]
pool = mp.Pool(processes = poolCount, maxtasksperchild= 2)
tempData = pool.map(self.MatrixHelper, args)
pool.close()
pool.join()
接下来是使用Process 类:
def Multiprocess(self, sigmaI, sigmaX):
cpus = mp.cpu_count()
print('Number of cpu\'s to process WM: %d' % cpus)
processes = [mp.Process(target = self.CreateMatrixMp, args = (sigmaI, sigmaX, i,)) for i in range(self.numPixels)]
for p in processes:
p.start()
for p in processes:
p.join()
Pool 似乎是更好的选择。我读过它会减少开销。而Process不考虑机器上cpu的数量。唯一的问题是,以这种方式使用Pool 会给我一个又一个错误,每当我修复一个时,它下面就会出现一个新的。 Process 似乎更容易实现,据我所知,这可能是更好的选择。你的经历告诉你什么?
如果应该使用Pool,那么我选择map()对吗?最好维持秩序。我有tempData = pool.map(...),因为map 函数应该返回每个进程的结果列表。我不确定Process 如何处理其返回的数据。
【问题讨论】:
-
@MartinAlderete 我读过那篇文章。但是,我在这里提出了一些需要回答的不同问题。他使用两个目标函数,而我使用一个,他不传递参数,而我传递多个,他不必担心他的目标是实例方法,就像我的那样。到目前为止,我已经对此进行了大量研究,
Pool和Process在不同的上下文中似乎表现不同,而且在某些情况下似乎会更好,而在其他情况下则不会。我认为开始一个新问题是合适的。
标签: python multiprocessing threadpool