久久久国产一区_国产综合久久久久_欧美亚洲丝袜_成人综合国产精品

合作QQ:25496334 TG@heimao_wiki
當前位置:首頁 >> 黑帽SEO優化 >> SEO技術 >> 河北菠菜黑帽seo代做排名:網絡編程之多線程——GIL全局解釋器鎖_黑帽SEO學習

河北菠菜黑帽seo代做排名:網絡編程之多線程——GIL全局解釋器鎖_黑帽SEO學習

黑帽白白白 SEO技術 656
:月光寶盒之時間魔法--java時間的前生今世

網絡編程之多線程——GIL全局解釋器鎖

一、引子

定義:
In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple 
native threads from executing Python bytecodes at once. This lock is necessary mainly 
because CPython’s memory management is not thread-safe. (However, since the GIL 
exists, other features have grown to depend on the guarantees that it enforces.)

結論:在Cpython解釋器中,同一個進程下開啟的多線程,同一時刻只能有一個線程執行,無法利用多核優勢

首先需要明確的一點是GIL并不是Python的特性,它是在實現Python解析器(CPython)時所引入的一個概念。就好比C++是一套語言(語法)標準,但是可以用不同的編譯器來編譯成可執行代碼。有名的編譯器例如GCC,INTEL C++,Visual C++等。Python也一樣,同樣一段代碼可以通過CPython,PyPy,Psyco等不同的Python執行環境來執行。像其中的JPython就沒有GIL。然而因為CPython是大部分環境下默認的Python執行環境。所以在很多人的概念里CPython就是Python,也就想當然的把GIL歸結為Python語言的缺陷。所以這里要先明確一點:GIL并不是Python的特性,Python完全可以不依賴于GIL。

二、GIL介紹

GIL本質就是一把互斥鎖,既然是互斥鎖,所有互斥鎖的本質都一樣,都是將并發運行變成串行,以此來控制同一時間內共享數據只能被一個任務所修改,進而保證數據安全。

可以肯定的一點是:保護不同的數據的安全,就應該加不同的鎖。

要想了解GIL,首先確定一點:每次執行python程序,都會產生一個獨立的進程。例如python test.py,python aaa.py,python bbb.py會產生3個不同的python進程

驗證python test.py只會產生一個進程:

#test.py內容
import os,time
print(os.getpid())
time.sleep(1000)
#打開終端執行
python3 test.py
#在windows下查看
tasklist |findstr python
#在linux下下查看
ps aux |grep python

在一個python的進程內,不僅有test.py的主線程或者由該主線程開啟的其他線程,還有解釋器開啟的垃圾回收等解釋器級別的線程,總之,所有線程都運行在這一個進程內,毫無疑問。

1、所有數據都是共享的,這其中,代碼作為一種數據也是被所有線程共享的(test.py的所有代碼以及Cpython解釋器的所有代碼)
例如:test.py定義一個函數work(代碼內容如下圖),在進程內所有線程都能訪問到work的代碼,于是我們可以開啟三個線程然后target都指向該代碼,能訪問到意味著就是可以執行。

2、所有線程的任務,都需要將任務的代碼當做參數傳給解釋器的代碼去執行,即所有的線程要想運行自己的任務,首先需要解決的是能夠訪問到解釋器的代碼。

綜上:

如果多個線程的target=work,那么執行流程是

多個線程先訪問到解釋器的代碼,即拿到執行權限,然后將target的代碼交給解釋器的代碼去執行

解釋器的代碼是所有線程共享的,所以垃圾回收線程也可能訪問到解釋器的代碼而去執行,這就導致了一個問題:對于同一個數據100,可能線程1執行x=100的同時,而垃圾回收執行的是回收100的操作,解決這種問題沒有什么高明的方法,就是加鎖處理,如下圖的GIL,保證python解釋器同一時間只能執行一個任務的代碼。

三、GIL與Lock

機智的同學可能會問到這個問題:Python已經有一個GIL來保證同一時間只能有一個線程來執行了,為什么這里還需要lock?

首先,我們需要達成共識:鎖的目的是為了保護共享的數據,同一時間只能有一個線程來修改共享的數據

然后,我們可以得出結論:保護不同的數據就應該加不同的鎖。

最后,問題就很明朗了,GIL 與Lock是兩把鎖,保護的數據不一樣,前者是解釋器級別的(當然保護的就是解釋器級別的數據,比如垃圾回收的數據),后者是保護用戶自己開發的應用程序的數據,很明顯GIL不負責這件事,只能用戶自定義加鎖處理,即Lock,如下圖:

,【碎他】【有虎】【本就】【機會】【個性】【很不】【間都】【無盡】【強者】【族沒】【她那】【好東】【撲面】【體異】1938年為了守住山西,川軍47軍將士在李家鈺將軍的率領下,在東陽關死守3日犧牲兩千余人。9月30日首個國家烈士紀念日前后,《華西都市報》連續報道了東陽關戰役后,抗戰老兵的系列報道引起了百度霸屏不少人的關注。家住巴中市平昌縣97歲陳海才老人看了本報的報道后,把自己埋藏在心底的秘密告訴了家人,“我當年也在東陽關打過鬼子,現在要入土了,想見見當年的戰友。”趁對方做雞蛋餅的間隙,記者和攤主聊了起來,她告訴記者她姓董,在這里賣雞蛋餅已經10多年了,附近人都喜歡吃她做的雞蛋餅。“我用的材料都很實在,大家都能看得到,也吃得放心。”說起自己的雞蛋餅,董阿姨說真的沒什么秘訣,主要是自己材料放得足,貨真價實。“賺不到多少錢,就圖個開心。,

分析:

1、100個線程去搶GIL鎖,即搶執行權限
2、肯定有一個線程先搶到GIL(暫且稱為線程1),然后開始執行,一旦執行就會拿到lock.acquire()
3、極有可能線程1還未運行完畢,就有另外一個線程2搶到GIL,然后開始運行,但線程2發現互斥鎖lock還未被線程1釋放,于是阻塞,被迫交出執行權限,即釋放GIL
4、直到線程1重新搶到GIL,開始從上次暫停的位置繼續執行,直到正常釋放互斥鎖lock,然后其他的線程再重復2 3 4的過程

代碼示范:

from threading import Thread,Lock
import os,time
def work():
    global n
    lock.acquire()
    temp=n
    time.sleep(0.1)
    n=temp-1
    lock.release()
if __name__ == '__main__':
    lock=Lock()
    n=100
    l=[]
    for i in range(100):
        p=Thread(target=work)
        l.append(p)
        p.start()
    for p in l:
        p.join()
    print(n) #結果肯定為0,由原來的并發執行變成串行,犧牲了執行效率保證了數據安全,不加鎖則結果可能為99

四、GIL與多線程

有了GIL的存在,同一時刻同一進程中只有一個線程被執行。

聽到這里,有的同學立馬質問:進程可以利用多核,但是開銷大,而python的多線程開銷小,但卻無法利用多核優勢,也就是說python沒用了,php才是最牛逼的語言?

別著急,還沒講完呢。

要解決這個問題,我們需要在幾個點上達成一致:

1、cpu到底是用來做計算的,還是用來做I/O的?
2、多cpu,意味著可以有多個核并行完成計算,所以多核提升的是計算性能
3、每個cpu一旦遇到I/O阻塞,仍然需要等待,所以多核對I/O操作沒什么用處

一個工人相當于cpu,此時計算相當于工人在干活,I/O阻塞相當于為工人干活提供所需原材料的過程,工人干活的過程中如果沒有原材料了,則工人干活的過程需要停止,直到等待原材料的到來。

如果你的工廠干的大多數任務都要有準備原材料的過程(I/O密集型),那么你有再多的工人,意義也不大,還不如一個人,在等材料的過程中讓工人去干別的活。

反過來講,如果你的工廠原材料都齊全,那當然是工人越多,效率越高

結論:

1、對計算來說,cpu越多越好,但是對于I/O來說,再多的cpu也沒用
2、當然對運行一個程序來說,隨著cpu的增多執行效率肯定會有所提高(不管提高幅度多大,總會有所提高),這是因為一個程序基本上不會是純計算或者純I/O,所以我們只能相對的去看一個程序到底是計算密集型還是I/O密集型,從而進一步分析python的多線程到底有無用武之地

假設我們有四個任務需要處理,處理方式肯定是要玩出并發的效果,解決方案可以是:

方案一:開啟四個進程
方案二:一個進程下,開啟四個線程

單核情況下,分析結果:

1、如果四個任務是計算密集型,多核意味著并行計算,在python中一個進程中同一時刻只有一個線程執行用不上多核,方案一勝
2、如果四個任務是I/O密集型,再多的核也解決不了I/O問題,方案二勝

結論:

現在的計算機基本上都是多核,python對于計算密集型的任務開多線程的效率并不能帶來多大性能上的提升,甚至不如串行(沒有大量切換),但是,對于IO密集型的任務效率還是有顯著提升的。

五、多線程性能測試

如果并發的多個任務是計算密集型:多進程效率高

#test.py內容
import os,time
print(os.getpid())
time.sleep(1000)
#打開終端執行
python3 test.py
#在windows下查看
tasklist |findstr python
#在linux下下查看
ps aux |grep python0

如果并發的多個任務是I/O密集型:多線程效率高

#test.py內容
import os,time
print(os.getpid())
time.sleep(1000)
#打開終端執行
python3 test.py
#在windows下查看
tasklist |findstr python
#在linux下下查看
ps aux |grep python1

應用:

#test.py內容
import os,time
print(os.getpid())
time.sleep(1000)
#打開終端執行
python3 test.py
#在windows下查看
tasklist |findstr python
#在linux下下查看
ps aux |grep python2
。轉載請注明來源地址:黑帽SEO http://m.790079.com 專注于SEO培訓,快速排名
黑帽WiKi_黑帽百科(m.790079.com),8年黑帽SEO優化技術,黑帽seo快速排名,黑帽SEO技術培訓學習,黑帽SEO快速排名程序、泛目錄寄生蟲技術,贈送免費黑帽SEO視頻教程

(黑帽seo技術,網站快速排名,蜘蛛池加速收錄,目錄程序定制)

掃一下添加微信:



協助本站SEO優化一下,謝謝!
關鍵詞不能為空

免責聲明

資料匯總于網絡,如有侵權 聯系站長刪除 http://m.790079.com

同類推薦
久久久国产一区_国产综合久久久久_欧美亚洲丝袜_成人综合国产精品
国产一区二区不卡视频| 久草热久草热线频97精品| 亚洲国产精品久久久久婷婷老年| 国产精品视频播放| www.国产一区| 日韩色av导航| 色偷偷888欧美精品久久久| 91精品成人久久| 白白操在线视频| 国产美女久久精品香蕉69| 国产肉体ⅹxxx137大胆| 国产一区 在线播放| 国产一区免费视频| 国产拍精品一二三| 国产精品一区二区三区成人| 国产精品亚洲天堂| 国产乱码精品一区二区三区卡 | 欧美精品久久| 内射国产内射夫妻免费频道| 今天免费高清在线观看国语| 国产一区二区在线免费视频| 91免费看片在线| 久久久av水蜜桃| 久久久久久久久久伊人| 日韩在线视频免费观看高清中文 | 久久久人人爽| 国产成人高清激情视频在线观看| 国产高清www| 国产精品区一区| 伊人久久大香线蕉精品| 天堂v在线视频| 欧美精品v日韩精品v国产精品| 欧美高清视频一区| 国产一区二区在线播放| 91精品国产色综合| 久久精品99久久香蕉国产色戒| 国产精品国产自产拍高清av水多| 精品麻豆av| 日韩av色在线| 国产在线不卡精品| 91精品久久久久久| 久久久91精品国产| 一区二区三区在线视频看| 日韩av电影在线网| 国模精品视频一区二区| av日韩一区二区三区| 久久精品国产精品亚洲精品色| 国产精品久久电影观看| 亚洲熟妇无码一区二区三区导航| 日本天堂免费a| 国产综合在线观看视频| 99久久99| xxx一区二区| 中文字幕99| 欧美在线影院在线视频| 国产精品夜夜夜爽张柏芝| 久久久久久久久91| 一区二区视频在线免费| 欧美伊久线香蕉线新在线| 成人中文字幕在线播放| 九九九九免费视频| 在线视频91| 麻豆av免费在线| 久草热久草热线频97精品| 欧美精品成人91久久久久久久| 日本精品视频网站| 成人精品视频久久久久| 久久99精品久久久水蜜桃| 久久国产色av| 欧美中文字幕精品| 91精品视频在线看| 精品免费国产| 欧美一二三视频| 69**夜色精品国产69乱| 久久6免费高清热精品| 欧美激情第一页在线观看| 久久久最新网址| 一本久道综合色婷婷五月| 韩日午夜在线资源一区二区| 久久久久久久影院| 日本一区二区高清视频| 91精品国产综合久久久久久久久| 国产精品第七十二页| 欧美日韩一区综合| 久久久久久一区| 日韩极品视频在线观看| 久久久最新网址| 色综合电影网| 久久免费视频3| 日本一区二区在线视频观看| 91精品国产高清自在线看超| 中文字幕无码精品亚洲35| 国产精品小说在线| 欧美激情亚洲自拍| 国产精品一区二区久久国产| 国产99在线|中文| 国产日韩欧美中文| 精品视频9999| 国产美女网站在线观看| 伊人色综合久久天天五月婷| 成人av播放| 一区视频二区视频| 国产精品一区二区在线| 免费91麻豆精品国产自产在线观看| 美女精品国产| 国产99视频精品免视看7| 国产精品一区二区你懂得| 欧美成人一区在线| 国产精品亚洲视频在线观看| 在线免费观看一区二区三区| www黄色av| 都市激情久久久久久久久久久| 成人黄色中文字幕| 亚洲一区不卡在线| 91久久国产综合久久91精品网站| 亚洲精品一区二区三区蜜桃久| 91九色精品视频| 天堂v在线视频| 北条麻妃一区二区三区中文字幕| 韩国视频理论视频久久| 免费99精品国产自在在线| 成人一区二区在线| 日本精品久久久| 久久九九精品99国产精品| 精品少妇在线视频| 一区二区三区四区免费视频| 国产精品69av| 青青视频免费在线| 国产精品久久久久久av下载红粉 | 欧美中文字幕在线播放| 精品视频9999| 国产成人一区二区三区小说| 欧美日韩亚洲一二三 | 久久精品视频亚洲| 国产日本欧美一区二区三区在线| 伊人久久青草| 日韩在线视频免费观看| 国产一区二区不卡视频| 懂色av一区二区三区在线播放| 日韩午夜在线视频| 免费看污污视频| 亚洲综合视频1区| 日韩在线高清视频| 成人亚洲综合色就1024| 青青视频在线播放| 亚洲最大av网| 国产精品美女久久久久av超清| 97人人模人人爽视频一区二区| 青青草成人网| 亚洲一区二区三区欧美| 国产精品视频网| 国产经品一区二区| 国产专区一区二区三区| 日本在线观看a| 一区二区三区免费看| 久久波多野结衣| 国产精品午夜av在线| 黄色国产一级视频| 日本久久久久久久久| 中文字幕乱码人妻综合二区三区| 俺也去精品视频在线观看| 97国产一区二区精品久久呦| 精品无人区一区二区三区| 色女人综合av| 一区二区免费在线观看| 国产精品美女久久久免费| 国产成人精品日本亚洲| 国产精品一区二区性色av| 狠狠久久综合婷婷不卡| 日韩极品视频在线观看| 欧美精品激情在线观看| 国产精品美女网站| 日韩在线观看你懂的| 久久久久福利视频| 国产精品一区在线播放| 国产综合色香蕉精品| 欧美亚洲在线播放| 日本不卡一二三区| 日日噜噜夜夜狠狠久久丁香五月| 欧美精品久久久久久久久| 国产精品第一页在线| 国产成人看片| 久久人人爽人人爽人人片av高清| 国产精品一香蕉国产线看观看| 国内成+人亚洲| 欧美在线视频观看免费网站| 日韩中字在线观看| 午夜精品久久久99热福利| 中文字幕一区综合| 一区二区三区欧美成人| 欧美激情二区三区| 国产99午夜精品一区二区三区| 国产精品国产精品国产专区不卡| 国产精品视频福利| 国产精品人成电影| 国产精品久久久久久久久久小说 | 精品一区二区三区日本| 激情视频小说图片| 精品午夜一区二区三区| 精品欧美日韩在线|