由于GIL,我认为多线程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上运行。
答案 0 :(得分:0)
一个原因可能是您使用的方法达到950%。有一个叫(avg)加载的数字可能不是人们在阅读文档之前所期望的。
加载是处于运行或可运行状态的(平均)线程数(在队列中占用CPU时间)。如果您在示例中有十个繁忙的循环线程,而一个线程正在运行,则另外九个处于可运行状态(在队列中为一个时隙)。
负载表示您可以使用多少个核心。或者程序想要使用多少CPU功率(不一定是它可以使用的实际CPU功率)。
答案 1 :(得分:0)
我认为在这种情况下,CPU正在忙于进行线程切换,而不是做一些实际的工作。换句话说,线程切换使用所有CPU来完成它的工作,但是python循环代码运行得太快而不能导致可观察的CPU使用率。我尝试添加一些实际的计算如下,CPU使用率下降到200%左右。如果你添加更多的计算,我相信CPU的使用率将非常接近100%。
def f():
x=1
while 1:
y=x*2