2016-03-04 45 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