程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python多線程對多核cpu的利用解析

編輯:Python

目錄

引言

沒有運行這段代碼前cpu狀態

運行之後的狀態

運行代碼結果

python線程的執行流程理解

遇到IO也會釋放GIL

引言

我們經常聽到"因為GIL的存在,python的多線程不能利用多核CPU",現在我們暫且不提GIL,python能不能利用多核cpu,今天我做了一個實驗,代碼很簡單如下所示

while 1: pass沒有運行這段代碼前cpu狀態

運行之後的狀態

下面兩張圖是運行之後的狀態,當然這只是兩張比較有代表性的圖,截圖間隔有十幾秒的樣子

根據第一張圖我們發現cpu1、cpu3的負載有明顯增長,我們可以得出python線程是可以利用多核cpu的結論,之前一直以為python運行後會綁定cpu其中的一個核心現在看來並不是這個樣子。第二張圖就比較有意思了cpu2滿載了,這又是為什麼呢?

想來想去應該是linux中cpu對進程的親和性導致的,這種親和性是軟性的並不是強制的,這也就解釋了為什麼第一張圖中是多cpu在負載。

ok為了更直觀的看出python線程能夠利用多核cpu,我們改下代碼,換一種方式再來看下

import oswhile 1: print os.getpid() # 輸出進程號運行代碼結果

一目了然,線程的確在不同的核心上切換。

現在我們回過頭看下那句經典的話"因為GIL的存在,python的多線程不能利用多核CPU",這句話很容易讓人理解成GIL會讓python在一個核心上運行,有了今天的例子我們再來重新理解這句話,GIL的存在讓python在同一時刻只能有一個線程在運行,這毋庸置疑,但是它並沒有給線程鎖死或者說指定只能在某個cpu上運行,另外我需要說明一點的是GIL是與進程對應的,每個進程都有一個GIL。

python線程的執行流程理解

線程 ——>搶GIL——>CPU

這種執行流程導致了CPU密集型的多線程程序雖然能夠利用多核cpu時跟單核cpu是差不多的,並且由於多個線程搶GIL這個環節導致運行效率<=單線程。

看到這可能會讓人產生一種錯覺,有了GIL後python是線程安全的,好像根本不需要線程鎖,而實際情況是線程拿到CPU資源後並不是一直執行的,python解釋器在執行了該線程100條字節碼(注意是字節碼不是代碼)時會釋放掉該線程的GIL,如果這時候沒有加鎖那麼其他線程就可能修改該線程用到的資源;

遇到IO也會釋放GIL

另外一個問題是遇到IO也會釋放GIL,下面是這兩種情況的例子

import threadinga = []def m1(): for _ in range(100000): a.append(1)def m2(): for _ in range(100000): a.append(2)def check(): """ 檢查a是否有序 """ for i in range(len(a)): if i != 0: if a[i] &lt; a[i-1]: print a[i-1], a[i] return False return Truet1 = threading.Thread(target=m1)t2 = threading.Thread(target=m2)t1.start()t2.start()t1.join()t2.join()print check()

預期1111...22222...,截圖顯示跟預期的不同

import threadingtext1 = '1' * 10000text2 = '2' * 10000def write(text): with open('test.txt', 'a') as f: f.write(text)def m1(): write(text1)def m2(): write(text2)t1 = threading.Thread(target=m1)t2 = threading.Thread(target=m2)t1.start()t2.start()t1.join()t2.join()

test.txt截圖

最後結論是,因為GIL的存在,python的多線程雖然可以利用多核CPU,但並不能讓多個核同時工作。

以上就是python多線程對多核cpu的利用解析的詳細內容,更多關於python多線程利用多核cpu的資料請關注軟件開發網其它相關文章!



  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved