gpt4 book ai didi

python - 使用多处理模块时如何提高 CPU 利用率?

转载 作者:太空宇宙 更新时间:2023-11-04 01:13:22 47 4
gpt4 key购买 nike

我在 Python 3.4 中工作,对内存中的分区数据执行简单搜索,并尝试 fork 进程以利用所有可用的处理能力。我说天真,因为我确信还有其他额外的事情可以提高性能,但这些潜力超出了手头问题的范围。

我正在测试的系统是 Windows 7 x64 环境。

我想要实现的是在 cpu_count() - 1 内核之间实现相对均匀的同时分布(阅读表明针对所有内核而不是 n-1 个内核进行分布不会显示任何额外的改进由于基线操作系统进程)。所以 75% Hook 了 4 核机器的 cpu 使用率。

我所看到的(使用 Windows 任务管理器的“性能选项卡”和“进程选项卡”)是我从未达到超过 25% 的系统专用 cpu 利用率并且进程 View 显示计算一次出现一个核心,在 fork 进程之间每隔几秒切换一次。

我没有检测计时代码,但我很确定我的主观观察是正确的,因为我没有获得预期的性能提升(在 i5 3320m 上是 3 倍)。

我还没有在 Linux 上测试过。

根据提供的代码:- 我怎样才能达到 75% 的 CPU 使用率?

#pseudo code
def search_method(search_term, partition):
<perform fuzzy search>
return results

partitions = [<list of lists>]
search_terms = [<list of search terms>]

#real code
import multiprocessing as mp

pool = mp.Pool(processes=mp.cpu_count() - 1)

for search_term in search_terms:
results = []
results = [pool.apply(search_method, args=(search_term, partitions[x])) for x in range(len(partitions))]

最佳答案

您实际上并没有在这里并发执行任何操作,因为您使用的是 pool.apply,它会阻塞直到您传递给它的任务完成。因此,对于 partitions 中的每个项目,您都在 pool 内的某个进程中运行 search_method,等待它完成,然后移动到下一个项目。这与您在 Windows 进程管理器中看到的完全一致。你要pool.apply_async相反:

for search_term in search_terms:
results = []
results = [pool.apply_async(search_method, args=(search_term, partitions[x])) for x in range(len(partitions))]

# Get the actual results from the AsyncResult objects returned.
results = [r.get() for r in results]

或者更好的是,使用 pool.map (连同 functools.partial 以允许将多个参数传递给我们的辅助函数):

from functools import partial
...

for search_term in search_terms:
func = partial(search_method, search_term)
results = pool.map(func, partitions)

关于python - 使用多处理模块时如何提高 CPU 利用率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26289998/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com