最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python多線程對(duì)多核cpu的利用解析

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

引言

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

while 1:
    pass

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

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

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

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

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

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

import os
while 1:
    print os.getpid() # 輸出進(jìn)程號(hào)

運(yùn)行代碼結(jié)果

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

現(xiàn)在我們回過頭看下那句經(jīng)典的話"因?yàn)镚IL的存在,python的多線程不能利用多核CPU",這句話很容易讓人理解成GIL會(huì)讓python在一個(gè)核心上運(yùn)行,有了今天的例子我們?cè)賮碇匦吕斫膺@句話,GIL的存在讓python在同一時(shí)刻只能有一個(gè)線程在運(yùn)行,這毋庸置疑,但是它并沒有給線程鎖死或者說指定只能在某個(gè)cpu上運(yùn)行,另外我需要說明一點(diǎn)的是GIL是與進(jìn)程對(duì)應(yīng)的,每個(gè)進(jìn)程都有一個(gè)GIL。

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

線程 ——>搶GIL——>CPU

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

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

遇到IO也會(huì)釋放GIL

另外一個(gè)問題是遇到IO也會(huì)釋放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é)論是,因?yàn)镚IL的存在,python的多線程雖然可以利用多核CPU,但并不能讓多個(gè)核同時(shí)工作。

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

相關(guān)文章

  • Python入門學(xué)習(xí)指南分享

    Python入門學(xué)習(xí)指南分享

    這篇文章主要為大家詳細(xì)介紹了Python入門的學(xué)習(xí)指南,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • python ansible自動(dòng)化運(yùn)維工具執(zhí)行流程

    python ansible自動(dòng)化運(yùn)維工具執(zhí)行流程

    ansible是基于 paramiko 開發(fā)的,并且基于模塊化工作,本身沒有批量部署的能力,接下來通過本文給大家分享python ansible自動(dòng)化運(yùn)維工具的特點(diǎn)及執(zhí)行流程,感興趣的朋友跟隨小編一起看看吧
    2021-06-06
  • 從零學(xué)Python之引用和類屬性的初步理解

    從零學(xué)Python之引用和類屬性的初步理解

    Python是一種解釋型、面向?qū)ο?、?dòng)態(tài)數(shù)據(jù)類型的高級(jí)程序設(shè)計(jì)語言。自從20世紀(jì)90年代初Python語言誕生至今,它逐漸被廣泛應(yīng)用于處理系統(tǒng)管理任務(wù)和Web編程。Python已經(jīng)成為最受歡迎的程序設(shè)計(jì)語言之一。2011年1月,它被TIOBE編程語言排行榜評(píng)為2010年度語言。自從2004年以后,python的使用率是呈線性增長(zhǎng)。
    2014-05-05
  • Python使用線程來接收串口數(shù)據(jù)的示例

    Python使用線程來接收串口數(shù)據(jù)的示例

    今天小編就為大家分享一篇Python使用線程來接收串口數(shù)據(jù)的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python導(dǎo)包的幾種方法(自定義包的生成以及導(dǎo)入詳解)

    python導(dǎo)包的幾種方法(自定義包的生成以及導(dǎo)入詳解)

    這篇文章主要介紹了python導(dǎo)包的幾種方法(自定義包的生成以及導(dǎo)入詳解),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • numpy求解線性代數(shù)相關(guān)問題

    numpy求解線性代數(shù)相關(guān)問題

    本文主要介紹了numpy求解線性代數(shù)相關(guān)問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • python 實(shí)現(xiàn)list或string按指定分段

    python 實(shí)現(xiàn)list或string按指定分段

    今天小編就為大家分享一篇python 實(shí)現(xiàn)list或string按指定分段,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python的keyword模塊用法實(shí)例分析

    python的keyword模塊用法實(shí)例分析

    這篇文章主要介紹了python的keyword模塊用法,實(shí)例分析了Python中keyword模塊的基本使用技巧,需要的朋友可以參考下
    2015-06-06
  • python清除字符串中間空格的實(shí)例講解

    python清除字符串中間空格的實(shí)例講解

    今天小編就為大家分享一篇python清除字符串中間空格的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 簡(jiǎn)單介紹Python中的len()函數(shù)的使用

    簡(jiǎn)單介紹Python中的len()函數(shù)的使用

    這篇文章主要簡(jiǎn)單介紹了Python中的len()函數(shù)的使用,包括在四種情況下的使用小例子,是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-04-04

最新評(píng)論

尤溪县| 台东市| 南康市| 新和县| 巴彦淖尔市| 南溪县| 天镇县| 车险| 历史| 永登县| 措勤县| 会同县| 枣阳市| 新蔡县| 六安市| 西吉县| 横峰县| 收藏| 花莲县| 乐业县| 岳池县| 项城市| 汝城县| 南京市| 东乡族自治县| 洪雅县| 疏附县| 枝江市| 自贡市| 肃南| 敖汉旗| 汝南县| 苍溪县| 六盘水市| 双鸭山市| 光泽县| 上虞市| 苏州市| 江源县| 大港区| 基隆市|