2016-03-04 764 views
4

由于GIL,我认为多线程python进程只能有一个线程同时运行,因此cpu的使用率不能超过100%。为什么单个python进程的CPU使用率可能超过100%?

但是我发现代码下面的代码可以占用950%的cpu占用率。

import threading 
import time 

def f(): 
    while 1: 
     pass 


for i in range(10): 
    t = threading.Thread(target=f) 
    t.setDaemon(True) 
    t.start() 

time.sleep(60) 

这与Python interpreters uses up to 130% of my CPU. How is that possible?的问题不是一回事。在这个问题中,OP说他正在做I/O密集型负载测试,它可能会释放GIL。但在我的程序中,没有I/O操作。

测试在CPython 2.6.6上运行。

+1

你检查过了吗? ... http://stackoverflow.com/a/29477244/1406040 – nKandel

+0

@nKandel是的,我知道什么950%的CPU使用意味着什么。但我不知道为什么多线程python进程可以使用多个cpu核心。 – WKPlus

+0

因为Linux研究人员想要证明他们的系统是最好的:它使得proc运行速度提高了10倍(是的,); –

回答

0

其中一个原因可能是您用来达到950%的方法。有一个称为(avg)加载的数字,在阅读文档之前,这可能不是人们所期望的。

加载是处于运行状态或可运行状态(在CPU时间的队列中)的线程的(平均)数量。如果你喜欢在你的例子中有一个忙线循环线程,而一个线程正在运行,另外九个线程处于可运行状态(在一个时隙的队列中)。

负载表示您可以使用多少个内核。或者你的程序想要使用多少CPU功率(不一定是它使用的实际CPU功率)。

0

我认为在这种情况下,CPU忙于做线程切换而不是做一些实际的工作。换句话说,线程切换器正在使用所有的CPU来完成它的工作,但是Python循环代码运行得太快而不能引起可观察的CPU使用率。我尝试添加一些真实的计算如下,CPU使用率下降到200%左右。如果您添加更多计算,我相信CPU使用率将非常接近100%。

def f(): 
    x=1 
    while 1: 
     y=x*2 
相关问题