在多線程 時同一時刻只容許一個線程來訪問CPU,直到解釋器遇到I/O操做或者操做次數達到必定數目時纔會釋放GIL
參考 Python雖然不能利用多線程實現多核任務,但能夠經過多進程實現多核任務。多個Python進程有各自獨立的GIL鎖,互不影響。 啓動與CPU核心數量相同的N個線程,在4核CPU上能夠監控到CPU佔用率僅有102%,也就是僅使用了一核。html
可是用C、C++或Java來改寫相同的死循環,直接能夠把所有核心跑滿,4核就跑到400%,8核就跑到800%,爲何Python不行呢?python
由於Python的線程雖然是真正的線程,但解釋器執行代碼時,有一個GIL鎖:Global Interpreter Lock,任何Python線程執行前,必須先得到GIL鎖,而後,每執行100條字節碼,解釋器就自動釋放GIL鎖,讓別的線程有機會執行。這個GIL全局鎖實際上把全部線程的執行代碼都給上了鎖,因此,多線程在Python中只能交替執行,即便100個線程跑在100核CPU上,也只能用到1個核。多線程
GIL是Python解釋器設計的歷史遺留問題,一般咱們用的解釋器是官方實現的CPython,要真正利用多核,除非重寫一個不帶GIL的解釋器。併發
線程之間共享內存的兩種處理方法:spa
參考: http://www.cnblogs.com/iiiiiher/p/8341091.html 參考 個人機器有4核,表明着同一時間,能夠幹4個任務。若是單核cpu的話,我啓動10個線程,我看上去也是併發的,由於是執行了上下文的切換,讓我看上去是併發的。可是單核永遠確定時串行的,它確定是串行的,cpu真正執行的時候,由於一會執行1,一會執行2.。。。。正常的線程就是這個樣子的。可是,在python中,不管你有多少核,永遠都是假象。不管你是4核,8核,仍是16核.......很差意思,同一時間執行的線程只有一個(線程),它就是這個樣子的。這個是python的一個開發時候,設計的一個缺陷,因此說python中的線程是假線程。線程
參考設計
咱們知道多進程(mutilprocess) 和 多線程(threading)的目的是用來被多顆CPU進行訪問, 提升程序的執行效率。 可是在python內部存在一種機制(GIL),在多線程 時同一時刻只容許一個線程來訪問CPU。 GIL 並非Python的特性,它是在實現Python解析器(CPython)時所引入的一個概念。就比如C++是一套語言(語法)標準,可是能夠用不一樣的編譯器來編譯成可執行代碼。有名的編譯器例如GCC,INTEL C++,Visual C++等。 Python也同樣,一樣一段代碼能夠經過CPython,PyPy,Psyco等不一樣的Python執行環境來執行。像其中的JPython就沒有GIL。然而由於CPython是大部分環境下默認的Python執行環境。因此在不少人的概念裏CPython就是Python,也就想固然的把 GIL 歸結爲Python語言的缺陷。因此這裏要先明確一點:GIL並非Python的特性,Python徹底能夠不依賴於GIL。 code
雖然python支持多線程,可是因爲GIL的限制,在實際運行時,程序運行後開啓多個線程,但在經過GIL後同時也只能有一個線程被CPU執行。htm
參考: http://www.cnblogs.com/zephyr-1/p/6043785.html GIL並非Python的特性,他是CPython引入的概念,是一個全局排他鎖。blog
解釋執行python代碼時,會限制線程對共享資源的訪問,直到解釋器遇到I/O操做或者操做次數達到必定數目時纔會釋放GIL。
因此,雖然CPython的線程庫直接封裝了系統的原生線程,但CPython總體做爲一個進程,同一時間只會有一個得到GIL的線程在跑,其餘線程則處於等待狀態。這就形成了即便在多核CPU中,多線程也只是作着分時切換而已,因此多線程比較適合IO密集型,不太適合CPU密集型的任務。 同一時刻一個解釋進程只有一行bytecode 在執行