所以我有一个我正在编写的算法,函数multiprocess
应该调用另一个函数CreateMatrixMp()
,在尽可能多的进程上并行地调用cpu。我以前从未做过多处理,无法确定下面哪种方法更有效。在函数CreateMatrixMp()
的上下文中使用的“efficient”一词可能需要调用数千次。我已经阅读了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
如何处理返回的数据。
我认为
Pool
类通常更方便,但这取决于您希望结果是有序的还是无序的。假设要创建4个随机字符串(例如,。可能是一个随机的用户ID生成器,大约是这样的):
在这里,顺序可能无关紧要。我不确定是否有更好的方法来实现这一点,但是如果我想按照调用函数的顺序跟踪结果,我通常会返回以ID作为第一项的元组,例如
接下来让我对结果进行排序:
泳池班
现在你的问题是:这与
Pool
类有什么不同? 您通常希望Pool.map
返回结果的有序列表,而不必经历创建元组和按I d排序的过程。因此,我认为它通常更有效。同样,还有一种“应用”方法:
在进程完成之前,
Pool.apply
和Pool.map
都将锁定主程序。现在,您还有
Pool.apply_async
和Pool.map_async
,它们在进程完成后立即返回结果,这与上面的Process
类基本相似。其优点可能是它们为您提供了方便的apply
和map
功能,您可以从Python的内置apply
和map
中了解这些功能相关问题 更多 >
编程相关推荐