繁体   English   中英

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

[英]How can I improve CPU utilization when using the multiprocessing module?

我正在Python 3.4中工作,对内存中的分区数据执行朴素的搜索,并尝试派生进程以利用所有可用的处理能力。 我之所以说是天真的,是因为我敢肯定还有其他一些事情可以做以提高性能,但是这些潜力超出了当前问题的范围。

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

我想实现的是在cpu_count() - 1内核之间的相对均匀的同时分布(阅读表明,由于基线os系统进程,针对所有内核而不是n-1个内核进行分配不会显示任何其他改进)。 因此,对于4核计算机,有75%的钉住cpu的使用率。

我所看到的(使用Windows任务管理器的“性能选项卡”和“进程选项卡”)是, 我从未达到大于25%的系统专用cpu利用率 ,并且进程视图显示一次同时发生一个核心,而每隔几个核心切换一次分叉过程之间的秒数。

我没有使用代码来计时,但是我很确定我的主观观察是正确的,因为我没有获得我期望的性能提升(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 ,你正在运行search_method在一些过程里面pool ,等待它完成,然后移动到下一个项目。 这与您在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来启用将多个参数传递给我们的worker函数):

from functools import partial
...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM