python高性能編程--002--全局解釋器鎖GIL
阿新 • • 發佈:2018-03-26
GIL一、GIL基本概念
1.GIL即為gloabl interpreter lock,全局解釋器鎖。這個東西是在python解釋器之一的cpython中引入的一個概念,因為我們現在常用的python解釋器就是cpython這個解釋器,故而GIL就在python中經常被提及。在JPython這個python解釋器中是不存在GIL這個東西的。
2.從python設計角度看GIL
Python代碼的執行由Python虛擬機(也叫解釋器主循環)來控制。Python在設計之初就考慮到要在主循環中,同時只有一個線程在執行,就像單CPU的系統中運行多個進程那樣,內存中可以存放多個程序,但任意時刻,只有一個程序在CPU中運行。同樣地,雖然Python解釋器中可以“運行”多個線程,但在任意時刻,只有一個線程在解釋器中運行。
對Python虛擬機的訪問由全局解釋器鎖(global interpreter lock, GIL)來控制,正是這個鎖能保證同一時刻只有一個線程在運行。
說白了就是為了保證在任意時刻只有一個線程在CPU在解釋器中運行。
GIL解決了什麽問題:
為了利用多核,python支持多線程,但是線程之間存在數據完整性和狀態同步問題,而GIL解決了多線程之間數據完整性和狀態同步問題(給運行在解釋器上的線程加鎖,確保了在某一時刻只有一個線程在解釋器中運行)。
1.GIL即為gloabl interpreter lock,全局解釋器鎖。這個東西是在python解釋器之一的cpython中引入的一個概念,因為我們現在常用的python解釋器就是cpython這個解釋器,故而GIL就在python中經常被提及。在JPython這個python解釋器中是不存在GIL這個東西的。
2.從python設計角度看GIL
Python代碼的執行由Python虛擬機(也叫解釋器主循環)來控制。Python在設計之初就考慮到要在主循環中,同時只有一個線程在執行,就像單CPU的系統中運行多個進程那樣,內存中可以存放多個程序,但任意時刻,只有一個程序在CPU中運行。同樣地,雖然Python解釋器中可以“運行”多個線程,但在任意時刻,只有一個線程在解釋器中運行。
說白了就是為了保證在任意時刻只有一個線程在CPU在解釋器中運行。
GIL解決了什麽問題:
為了利用多核,python支持多線程,但是線程之間存在數據完整性和狀態同步問題,而GIL解決了多線程之間數據完整性和狀態同步問題(給運行在解釋器上的線程加鎖,確保了在某一時刻只有一個線程在解釋器中運行)。
GIL的影響:
給線程加鎖,會對python多線程的效率有不小的影響,使用多線程進行CPU密集型的操作,會存在頻繁的上下文切換,效率低下。
在多線程環境中,Python虛擬機按以下方式執行:
>設置GIL
>切換都一個線程去運行
>運行:a.指定數量的字節碼的指令;b.線程主動讓出控制;
>把線程設置為睡眠狀態
>解鎖GIL
>再次重復上述所有步驟
3.如何避免GIL的影響
>用multiprocessing代替Thread
>用其他python解釋器
python高性能編程--002--全局解釋器鎖GIL