【发布时间】:2020-10-30 21:08:14
【问题描述】:
我有一个基本上是多线程的应用程序:线程 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 秒
究竟发生了什么?为什么使用最大的硬件不能获得最佳性能?我使用多线程的方式有问题吗?
【问题讨论】:
-
由于您不接受当前的答案,您在寻找什么样的答案?您是否打算使用更多信息更新您的答案?根据您目前提供的信息,我认为很难给出更有用的答案。
-
对不起,我的回答迟了,但问题已经解决。这种行为的原因是我使用了错误的命令 (multiprocessing.cpu_count()) 来设置要使用的进程数量,该命令返回的结果是应有的两倍,在 mp 中必须只使用物理 cpu,没有逻辑...
-
很高兴听到您找到了解决方案。您可以将其发布为答案吗?其他用户(包括我)可能对细节感兴趣。如果您认为这是可用的最佳答案,您甚至可以接受自己的答案。提前致谢。
标签: python multiprocessing python-multiprocessing python-multithreading