2015-09-06 109 views
2

我有一個服務器10個的CPU內核,當我跑下面的代碼,其中一個線程時,CPU核心用法之一爲100%:蟒多個線程性能

def fun(): 
    while 1: 
     pass 

但是當我使用5個線程運行相同的代碼,有5個CPU核心使用率分別爲:30%,20%,15%,25%,12%。

爲什麼不是5個CPU使用率分別爲100%?如果多個python線程不能完全使用CPU,多線程應該如何比一個線程更快?

+2

這可能是因爲[Global Interpreter Lock](https://wiki.python.org/moin/GlobalInterpreterLock)。根據你的問題,你可以通過'multiprocessing'來解決它。 – mgilson

回答

4

你所描述的是典型的瓶頸,當更多的內核試圖訪問單個鎖時,它會變得更加現實。正如mgilson提到的,這是GIL的許多實現中存在的副作用。 Python中的GIL保證一次只有一個線程執行Python字節碼。這是歷史原因。但正如羅蘭在評論中也提到的那樣,GIL使得垃圾回收器的調試更容易。有像IronPython這樣的實現,雖然沒有GIL。

Python 2和Python 3有不同的方法如何線程獲取GIL。

的Python 2:http://www.dabeaz.com/python/GIL.pdf

的Python 3:http://www.dabeaz.com/python/NewGIL.pdf

一種解決方案是獨立產卵Python解釋。他們作爲獨立的流程工作,可以做自己的工作。 multiprocessing模塊可以幫助你。

+0

「避免**的一種解決方案」?可能你的意思是「一種可能的解決方案」。 –

+0

我編輯了答案,我相信@AndreaCorbellini是正確的。 –

+0

那些歷史原因是,現在仍然是非常實用*和*有效*。讓GIL使垃圾收集代碼變得簡單很多(它不是線程安全的,但必須沒有GIL)。刪除GIL的願望已經出現了好幾次,但沒有人管理它,[出於以下原因](https://wiki.python.org/moin/GlobalInterpreterLock)。 –