GIL(全局解釋器鎖)
我的機器有4核,代表著同一時間艇炎,可以干4個任務酌伊。如果單核cpu的話腾窝,我啟動10個線程,我看上去也是并發(fā)的居砖,因為是執(zhí)行了上下文的切換虹脯,讓我看上去是并發(fā)的。但是單核永遠肯定時串行的奏候,它肯定是串行的循集,cpu真正執(zhí)行的時候,因為一會執(zhí)行1蔗草,一會執(zhí)行2.咒彤。。咒精。镶柱。正常的線程就是這個樣子的。但是模叙,在python中歇拆,無論你有多少核,永遠都是假象范咨。無論你是4核故觅,8核,還是16核.......不好意思渠啊,同一時間執(zhí)行的線程只有一個(線程)输吏,它就是這個樣子的。這個是python的一個開發(fā)時候替蛉,設計的一個缺陷贯溅,所以說python中的線程是假線程。
GIL(全局解釋器鎖)
我們知道多進程(mutilprocess) 和 多線程(threading)的目的是用來被多顆CPU進行訪問, 提高程序的執(zhí)行效率灭返。 但是在python內(nèi)部存在一種機制(GIL)盗迟,在多線程 時同一時刻只允許一個線程來訪問CPU。
GIL 并不是Python的特性熙含,它是在實現(xiàn)Python解析器(CPython)時所引入的一個概念罚缕。就好比C++是一套語言(語法)標準,但是可以用不同的編譯器來編譯成可執(zhí)行代碼怎静。有名的編譯器例如GCC邮弹,INTEL C++黔衡,Visual C++等。
Python也一樣腌乡,同樣一段代碼可以通過CPython盟劫,PyPy,Psyco等不同的Python執(zhí)行環(huán)境來執(zhí)行与纽。像其中的JPython就沒有GIL侣签。然而因為CPython是大部分環(huán)境下默認的Python執(zhí)行環(huán)境。所以在很多人的概念里CPython就是Python急迂,也就想當然的把 GIL 歸結(jié)為Python語言的缺陷影所。所以這里要先明確一點:GIL并不是Python的特性,Python完全可以不依賴于GIL僚碎。
雖然python支持多線程猴娩,但是由于GIL的限制,在實際運行時勺阐,程序運行后開啟多個線程卷中,但在通過GIL后同時也只能有一個線程被CPU執(zhí)行。
GIL(全局解釋器鎖)
參考:?http://www.cnblogs.com/zephyr-1/p/6043785.html
GIL并不是Python的特性渊抽,他是CPython引入的概念蟆豫,是一個全局排他鎖。
解釋執(zhí)行python代碼時腰吟,會限制線程對共享資源的訪問无埃,直到解釋器遇到I/O操作或者操作次數(shù)達到一定數(shù)目時才會釋放GIL。
所以毛雇,雖然CPython的線程庫直接封裝了系統(tǒng)的原生線程嫉称,但CPython整體作為一個進程,同一時間只會有一個獲得GIL的線程在跑灵疮,其他線程則處于等待狀態(tài)织阅。這就造成了即使在多核CPU中,多線程也只是做著分時切換而已震捣,所以多線程比較適合IO密集型荔棉,不太適合CPU密集型的任務。
同一時刻一個解釋進程只有一行bytecode 在執(zhí)行