1. 程式人生 > >python高性能編程--002--全局解釋器鎖GIL

python高性能編程--002--全局解釋器鎖GIL

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解決了多線程之間數據完整性和狀態同步問題(給運行在解釋器上的線程加鎖,確保了在某一時刻只有一個線程在解釋器中運行)。

GIL的影響:
給線程加鎖,會對python多線程的效率有不小的影響,使用多線程進行CPU密集型的操作,會存在頻繁的上下文切換,效率低下。

在多線程環境中,Python虛擬機按以下方式執行:

>設置GIL
>切換都一個線程去運行
>運行:a.指定數量的字節碼的指令;b.線程主動讓出控制;
>把線程設置為睡眠狀態
>解鎖GIL
>再次重復上述所有步驟

3.如何避免GIL的影響

>用multiprocessing代替Thread
>用其他python解釋器

python高性能編程--002--全局解釋器鎖GIL