91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中GIL的使用方法

發布時間:2021-01-29 16:01:19 來源:億速云 閱讀:163 作者:Leah 欄目:開發技術

Python中GIL的使用方法?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

GIL:又叫全局解釋器鎖,每個線程在執行的過程中都需要先獲取GIL,保證同一時刻只有一個線程在運行,目的是解決多線程同時競爭程序中的全局變量而出現的線程安全問題。它并不是python語言的特性,僅僅是由于歷史的原因在CPython解釋器中難以移除,因為python語言運行環境大部分默認在CPython解釋器中。

通過一個案例了解單線程和多線程的cpu占用率:

打開Ubuntu終端命令:輸入htop,回車,紅色箭頭指向的2代表此時我的虛擬機中CPU有兩個核心數

Python中GIL的使用方法

下面通過一個案例了解單線程死循環和多線程死循環的CPU占用率:

單線程死循環.py: 

#coding=utf-8
while True:
  pass

運行該程序,出現以下界面:

Python中GIL的使用方法

此時新開一個窗口,輸入htop,查看CPU占用率,其中一個CPU占用率幾乎為100%:

Python中GIL的使用方法

兩個線程死循環.py

#coding=utf-8
import threading
 
#子線程死循環
def test():
  while True:
    pass
 
t1=threading.Thread(target=test)
t1.start()
 
#主線程死循環,
while True:
  pass

此時新開一個終端,輸入htop查看CPU占用率,可以看到兩個CPU任何一個并沒有全部占滿,而是交替執行的:

Python中GIL的使用方法

 這也就驗證了多線程下每個線程在執行的過程中都需要先獲取GIL,保證同一時刻只有一個線程在運行。

由于GIL的存在,即使是多線程,事實上同一時刻只能保證一個線程在運行,既然這樣多線程的運行效率不就和單線程一樣了嗎,那為什么還要使用多線程呢?

由于以前的電腦基本都是單核CPU,多線程和單線程幾乎看不出差別,可是由于計算機的迅速發展,現在的電腦幾乎都是多核CPU了,最少也是兩個核心數的,這時差別就出來了:通過之前的案例我們已經知道,即使在多核CPU中,多線程同一時刻也只有一個線程在運行,這樣不僅不能利用多核CPU的優勢,反而由于每個線程在多個CPU上是交替執行的,導致在不同CPU上切換時造成資源的浪費,反而會更慢。即原因是一個進程只存在一把gil鎖,當在執行多個線程時,內部會爭搶gil鎖,這會造成當某一個線程沒有搶到鎖的時候會讓cpu等待,進而不能合理利用多核cpu資源。

例如在使用多線程抓取網頁內容時,遇到IO阻塞時,正在執行的線程會暫時釋放GIL鎖,這時其它線程會利用這個空隙時間,執行自己的代碼,因此多線程抓取比單線程抓取性能要好。

說到在這里要先介紹兩個概念:計算密集型和IO密集型

計算密集型:要進行大量的數值計算,例如進行上億的數字計算、計算圓周率、對視頻進行高清解碼等等。這種計算密集型任務雖然也可以用多任務完成,但是花費的主要時間在任務切換的時間,此時CPU執行任務的效率比較低。

IO密集型:涉及到網絡請求(time.sleep())、磁盤IO的任務都是IO密集型任務,這類任務的特點是CPU消耗很少,任務的大部分時間都在等待IO操作完成(因為IO的速度遠遠低于CPU和內存的速度)。對于IO密集型任務,任務越多,CPU效率越高,但也有一個限度。

解決GIL問題的方案:

1.使用其它語言,例如C,Java

2.使用其它解釋器,如java的解釋器jython

3.使用多進程

線程釋放GIL鎖的情況:

1.在IO操作等可能會引起阻塞的system call之前,可以暫時釋放GIL,但在執行完畢后,必須重新獲取GIL。

2.Python 3.x使用計時器(執行時間達到閾值后,當前線程釋放GIL)或Python 2.x,tickets計數達到100。

GIL面試題參考答案:

  • Python語言和GIL沒有什么關系。僅僅是由于歷史原因在Cpython虛擬機(解釋器),難以移除GIL。

  • GIL:全局解釋器鎖。每個線程在執行的過程都需要先獲取GIL,保證同一時刻只有一個線程可以執行代碼。

  • 線程釋放GIL鎖的情況: 在IO操作等可能會引起阻塞的system call之前,可以暫時釋放GIL,但在執行完畢后,必須重新獲取GIL Python 3.x使用計時器(執行時間達到閾值后,當前線程釋放GIL)或Python 2.x,tickets計數達到100。

  • Python使用多進程是可以利用多核的CPU資源的。

  • 多線程爬取比單線程性能有提升,因為遇到IO阻塞會自動釋放GIL鎖。

看完上述內容,你們掌握Python中GIL的使用方法的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东源县| 岐山县| 长泰县| 长岭县| 莲花县| 迁西县| 庆阳市| 万盛区| 霍林郭勒市| 遂溪县| 青冈县| 哈密市| 叙永县| 阳原县| 竹山县| 平陆县| 华安县| 唐河县| 奎屯市| 开鲁县| 普兰店市| 灵丘县| 汝城县| 藁城市| 东海县| 浏阳市| 四会市| 耒阳市| 沈丘县| 崇仁县| 英德市| 平湖市| 乐东| 黔西| 铜梁县| 南漳县| 丰镇市| 水城县| 长汀县| 美姑县| 东丰县|