日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python hack_Python进阶:深入GIL(上篇)

發布時間:2025/3/15 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python hack_Python进阶:深入GIL(上篇) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python進階:深入GIL(上篇)HackPython致力于有趣有價值的編程教學

簡介

熟悉Python的人理應都聽過GIL(Global Interpreter Lock,全局解釋器鎖) ,大概也知道它就是造成Python多線程并發其實是「偽并行」的核心原因,但依舊很多人沒有深入其中,所以HackPython嘗試以上、下兩篇文章來闡釋GIL,分別從其表現現象、對應源碼以及Python對GIL改進等方面進行討論 。

線程與進程

在討論GIL前,先通過簡單的文字描述一下線程與進程并理解其中的關系。

當我們啟動一個程序時,系統中就至少啟動了一個對應的進程,即一個程序至少對應一個進程 。所謂程序,它其實是一種靜態的資源實體,就是一堆代碼,存在于硬盤中,本身沒有任何運行的含義,而進程是動態的,它是程序操作某個數據集時的動態實體,存在于內存中 。

一個進程可以包含多個線程,這些線程可以共享當前進程中的內存空間 ,這種特性就出現了線程不安全的概念,即多個線程同時使用了一個空間,導致程序邏輯錯誤 ,常見的方式就是使用鎖或信號量等機制來限制公共資源的使用 。

Python多線程的偽并行

Python中可以使用「threading」模塊來創建并使用多線程,為了直觀比較,先試一下一個沒有使用多線程的代碼 ,如下:import time

def add(n):

sum = 0

while sum <= n:

sum += 1

print(f'sum:{sum}')

if __name__ == '__main__':

start = time.time()

add(500000000)

print('run time: %s'%str(time.time() - start))

代碼非常簡單,就是一個add()方法一直做累加操作,運行結果為 :python 5.py

sum:500000001

run time: 23.80576515197754

那我使用多線程效果會不會好一些呢?憑感覺直觀而言,應該是會的 ,因為上面的程序只使用了一個線程,那我開兩個線程,讓其同時工作,其運行時間應該短一半才對 ,但事實時使用多線程后,運行時間依舊沒有變動 ,多線程版本的代碼如下:import threading, time

def add(n):

sum = 0

while sum <= n:

sum += 1

print(f'sum:{sum}')

if __name__ == '__main__':

start = time.time()

n = 500000000

t1 = threading.Thread(target=add, args=[n//2])

t2 = threading.Thread(target=add, args=[n//2])

t1.start()

t2.start()

t1.join()

t2.join()

print('run time: %s'%str(time.time() - start))

為了讓相加的數量相近,這里每個線程只需要執行「n//2」次,使用join的目的是得等線程運行完后,再執行后續的邏輯,這里只是為了方便記錄運行時間 。運行結果如下:python 6.py

sum:250000001

sum:250000001

run time: 23.04693603515625

發現跟一開始單線程的程序在運行時間上沒有什么差異,而造成這種現象的原因就是GIL ,需要注意的是,GIL只存在于通過C語言實現的Python解釋器上,即CPython上 ,后人為了繞過GIL的問題利用Java開發了Jpython或使用Python自己開發了自己的解釋器PyPy,這些上都不存在GIL全局解釋器鎖的問題 ,但CPython才是當前最多人使用的主流Python解釋器 。

在CPython中,每一個Python線程執行前都需要去獲得GIL鎖 ,獲得該鎖的線程才可以執行,沒有獲得的只能等待 ,當具有GIL鎖的線程運行完成后,其他等待的線程就會去爭奪GIL鎖,這就造成了,在Python中使用多線程,但同一時刻下依舊只有一個線程在運行 ,所以Python多線程其實并不是「并行」的,而是「并發」 。

看到下圖,圖中是Python中GIL的工作實例,其中有3個線程,線程與線程之間是順序執行的 ,每個線程開始執行時都會去獲得GIL,防止其他線程線程運行 ,每執行完一段時間后,就會釋放GIL,讓別的線程可以去爭奪執行權限,如果自己本身也沒有執行完,則本身也會參與這次爭奪 。

可以發現,Python中的線程工作一段時間后,會主動釋放GIL,這是為了讓其他線程都有機會執行 ,而釋放的時機就涉及到了「檢查間隔」(check interval)機制 ,在早期版本的Python中,檢查機制是100ticks,而Python3后,每15毫米使用一次檢查間隔,然后就會釋放GIL鎖 。

但需要注意的是線程有了GIL后并不意味著使用Python多線程時不需要考慮線程安全 ,「GIL的存在是為了方便使用C語言編寫CPython解釋器的編寫者,而頂層使用Python時依舊要考慮線程安全」 ,在下一篇中會從原始編碼層面來解釋存在GIL后,依舊會有線程不安全現象的原因。

多進程實現并行

GIL的存在讓Python多線程在運行CPU密集型性程序時顯得非常無力,為了繞過GIL的限制,一種簡單的方法就是使用多進程 ,這是因為GIL只會存在于線程級別,即一個進程為了確保某一時刻下只有一個線程在運行,才使用GIL ,但多個進程之間并不會出現這種限制,不同的進程會運行在CPU不同的核上,實現真正的「并行」 。

通過進程的方式將上面的任務再執行一遍,看一下運行時長,具體代碼如下:from multiprocessing import Process

import time

def add(procname, n):

sum = 0

while sum <= n:

sum += 1

print(f'process name: {procname}')

print(f'sum: {sum}')

if __name__ == '__main__':

start = time.time()

n = 500000000

p1 = Process(target=add, args=('Proc-1',n//2))

p2 = Process(target=add, args=('Proc-2',n//2))

p1.start()

p2.start()

p1.join()

p2.join()

print('run time: %s'%str(time.time() - start))

Python中多進程可以使用 multiprocessing 這個庫,使用方法與使用線程類似 ,代碼中啟用了兩個進程,分別運行 n//2 數據量的數據,其結果如下:python 7.py

process name: Proc-1

sum: 250000001

process name: Proc-2

sum: 250000001

run time: 12.768253087997437

從結果可以看出,時間確實減少了一半左右,多進程狀態下確實是真正的「并行」。

如何繞過GIL?

有了多進程后,大部分程序都可以通過多進程的方式繞過GIL ,但如果依舊不滿足,就需要使用C/C++來實現這部分代碼,并生成對應的so或dll文件,再通過Python的ctypes將其調用起來 ,Python中很多對計算性能有較高要求的庫都采用了這種方式,如Numpy、Pandas等等 。

如果你對程序的性能要求的特別嚴格,此時更好的方法是選擇其他語言 。

結尾

本節簡單的討論了Python中GIL相關的內容,在下一篇中會從代碼層面再次深入的討論GIL的相關內容,歡迎學習 HackPython 的教學課程并感覺您的閱讀與支持。

參考文章:

總結

以上是生活随笔為你收集整理的python hack_Python进阶:深入GIL(上篇)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一级日韩片 | 91性生活| 亚洲精品国产欧美在线观看 | 激情网色| 中国亚洲老头同性gay男男… | www.夜夜| 欧美中文字幕视频 | 中文写幕一区二区三区免费观成熟 | 亚州中文 | 麻豆网站免费观看 | 日本视频二区 | 在线观看日韩中文字幕 | 日本三级韩国三级三级a级中文 | 国产微拍精品 | 亚洲成人黄色 | 操白虎逼 | 国产精品99久久 | 欧美国产在线看 | 精品国自产在线观看 | 久久午夜鲁丝片午夜精品 | 久草久热 | 天堂资源地址在线 | 国产精品欧美综合亚洲 | se欧美| 都市激情国产精品 | 韩国三级黄色 | 欧美熟妇乱码在线一区 | 亚洲精品黄 | 夜色视频在线观看 | 日本在线视频一区二区 | 少妇精品高潮欲妇又嫩中文字幕 | 中国免费毛片 | 日韩视频在线观看免费视频 | 动漫美女隐私无遮挡 | 在线观看黄网址 | 蜜桃精品在线观看 | 日韩123 | 三上悠亚激情av一区二区三区 | 欧美交换| 亚洲人天堂 | 亚洲欧美国产精品专区久久 | 国产精品美女网站 | 另类天堂av | aa一级黄色片 | 免费看日批视频 | 瑟瑟av| 欧美日韩在线免费视频 | 奇米影视9999 | 成人免费黄色小视频 | 亚洲五码av| 日本a级片网站 | 原神淫辱系列同人h | 欧美高清hd19 | 大乳女喂男人吃奶视频 | 超碰8| 日本人添下边视频免费 | 国产精品久久久久久久久久久不卡 | 男人天堂社区 | 成人亚洲| 中文字幕亚洲欧美日韩 | 香蕉久久久久 | 毛茸茸成熟亚洲人 | 欧美性生活一区二区三区 | 亚洲av综合一区 | 美女毛片视频 | 日批网站在线观看 | 国产精品乱码一区 | 免费在线看a| 亚洲欧洲免费视频 | 四虎影视在线播放 | av福利社| 羞羞的视频在线观看 | 丰满少妇aaaaaa爰片毛片 | 91久久国产综合久久91 | 天天操天天操天天操 | 精品久久网站 | 黄色亚洲视频 | 狠狠躁18三区二区一区传媒剧情 | 天天碰天天操 | 亚洲精品网站在线观看 | 亚洲影院一区 | 精品视频一区二区三区四区五区 | 黄色美女免费网站 | 国产精品国产三级国产普通话对白 | www.99视频| 成人夜晚视频 | 久久美女免费视频 | 中文有码一区 | 国产精品三级久久久久久电影 | 亚洲av成人精品一区二区三区在线播放 | 欧美性生活免费视频 | 国产一区二区三区自拍 | 污视频在线观看免费 | 美女隐私无遮挡 | 精品无码国产污污污免费网站 | 日本网站在线看 | 91在线视频 | 久久精品99| 亚洲一区二区精品在线观看 |