亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2022年07月01日 11:13:39   作者:挪威的森林s  
這篇文章主要為大家介紹了python多線程對多核cpu的利用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

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

while 1:
    pass

沒有運行這段代碼前cpu狀態(tài)

運行之后的狀態(tài)

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

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

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

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

import os
while 1:
    print os.getpid() # 輸出進程號

運行代碼結(jié)果

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

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

python線程的執(zhí)行流程理解

線程 ——>搶GIL——>CPU

這種執(zhí)行流程導致了CPU密集型的多線程程序雖然能夠利用多核cpu時跟單核cpu是差不多的,并且由于多個線程搶GIL這個環(huán)節(jié)導致運行效率<=單線程。

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

遇到IO也會釋放GIL

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

import threading
a = []
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 True
t1 = threading.Thread(target=m1)
t2 = threading.Thread(target=m2)
t1.start()
t2.start()
t1.join()
t2.join()
print check()

預(yù)期1111...22222...,截圖顯示跟預(yù)期的不同

import threading
text1 = '1' * 10000
text2 = '2' * 10000
def 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截圖

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

以上就是python多線程對多核cpu的利用解析的詳細內(nèi)容,更多關(guān)于python多線程利用多核cpu的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python登錄接口如何獲取token并保存到文件中

    Python登錄接口如何獲取token并保存到文件中

    這篇文章主要介紹了Python登錄接口如何獲取token并保存到文件中問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python獲取當前路徑實現(xiàn)代碼

    Python獲取當前路徑實現(xiàn)代碼

    這篇文章主要介紹了 Python獲取當前路徑實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Django CBV模型源碼運行流程詳解

    Django CBV模型源碼運行流程詳解

    這篇文章主要介紹了Django CBV模型源碼運行流程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Python Mysql自動備份腳本

    Python Mysql自動備份腳本

    測試系統(tǒng)環(huán)境 Windows 2003 python 2.5.1 mysql 5.0.1 應(yīng)該只適用于Win,因為調(diào)用了CMD。 增量備份,因為自用,數(shù)據(jù)庫不大。
    2008-07-07
  • 使用python加密主機文件幾種方法實現(xiàn)

    使用python加密主機文件幾種方法實現(xiàn)

    本文主要介紹了使用python加密主機文件幾種方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • Python建造者模式案例運行原理解析

    Python建造者模式案例運行原理解析

    這篇文章主要介紹了python建造者模式案例運行原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 利用python求積分的實例

    利用python求積分的實例

    今天小編就為大家分享一篇利用python求積分的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python把數(shù)組中的數(shù)字每行打印3個并保存在文檔中的方法

    python把數(shù)組中的數(shù)字每行打印3個并保存在文檔中的方法

    今天小編就為大家分享一篇python把數(shù)組中的數(shù)字每行打印3個并保存在文檔中的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • python爬蟲通過增加多線程獲取數(shù)據(jù)

    python爬蟲通過增加多線程獲取數(shù)據(jù)

    這篇文章主要為大家介紹了python爬蟲通過增加多線程獲取數(shù)據(jù)實現(xiàn)過程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • 關(guān)于使用python反編譯apk簽名出包的問題

    關(guān)于使用python反編譯apk簽名出包的問題

    這篇文章主要介紹了使用python反編譯apk簽名出包,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03

最新評論