![](/img/trans.png)
[英]High CPU utilization for high specs server using python multiprocessing
[英]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.