为什么单个python进程的cpu使用率可以超过100%?

时间:2016-03-04 08:14:49

标签: python multithreading cpython

由于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上运行。

2 个答案:

答案 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