ProcessPoolExecutor以非直观的方式提高性能



我有一个基本上是多线程的应用程序:线程1是计算,线程2是GUI(Tkinter(。计算的一部分包括一个带循环的函数。因此,我决定以这样一种方式在这里使用多处理:

def mpw1(idw_tree, mapsdata, inlines, xlines, x, y, dfattrs, calcplan, attrsdim, mdim):
n_cores = os.cpu_count()
flatcubec2 = np.zeros((attrsdim,mdim))
with ProcessPoolExecutor(n_cores) as ex:
args = ((i, calcplan, idw_tree, mapsdata, dfattrs, flatcubec2, inlines, xlines, n_cores) for i in range(n_cores))
flatcubec2 = ex.map(circle, args)
return flatcubec2

其中circle只是一个计算函数(假设它在计算一些东西(。

但奇怪的是,尽可能多地设置n_cores并不能让我获得最佳性能。以下是一些信息:

8核(最大(-17秒
6核-14秒
4核-12秒
3核-14秒钟
2核-17秒

到底发生了什么?为什么使用最大限度的硬件不能获得最佳性能?问题是在我使用多线程的方式中吗?

首先,因为您使用的是ProcessPoolExecutor,所以它是多处理,而不是线程。由于全局解释器锁定,多线程在Python中几乎没有性能提升。

其次,如果没有看到实际的代码,很难解释应用程序的性能。多处理涉及相当多的开销,因此只有当您有相当多的处理工作要做(当然,还有足够的可用内核来执行进程(时,它才有用。

从您发布的结果来看,似乎多达4个核心的工作负载被分配给了可用的核心,并获得了一些性能,但当使用更多核心时,开销会增加到比处理时间增加更昂贵的程度。

这种行为的解释是,我使用了错误的命令(multiprocessing.cpu_count((来设置要使用的进程数量,这个命令返回的次数是它应该返回的两倍,在mp中,必须只使用物理cpu,而不使用逻辑cpu因此,这种行为,当第4次";工人;(在我的情况下是物理cpu的最大值(性能开始下降的原因可以解释为多处理只使用物理cpu进行显式和可预测的工作。为了获得物理cpu的数量,我只使用了:

psutil.cpu_count(logical = False)

相关内容

  • 没有找到相关文章