1. 程式人生 > >Python3:談談python的GIL、多執行緒、多程序

Python3:談談python的GIL、多執行緒、多程序

本文只是適合初認識多執行緒的小夥伴,裡面的概念和原理一定要搞清楚,
不然以後設計多執行緒,多程序會出很大的錯.
GIL的全稱是Global Interpreter Lock(全域性直譯器鎖),來源是python設計之初的考慮,為了資料安全所做的決定。

GIL 的特點:

  1. Python在多執行緒下,每個執行緒的執行方式為:
    1.獲取GIL
    2.執行程式碼直到sleep或者是python虛擬機器將其掛起。
    3.釋放GIL (釋放的條件,我下邊再解釋)
  2. 一個CPU只能執行一個執行緒 ,例如一個CPU 有三個執行緒 ,首先執行緒A執行 ,然後
    執行緒A達到釋放條件進行釋放GIL,執行緒B 和執行緒C 進行競爭GIL ,誰搶到GIL ,繼續執行.
  3. 一個程序裡有多執行緒,但只有一個GIL 鎖,不同的程序GIL 鎖互不干擾,
  4. 單個CPU多執行緒比多核多執行緒更快解釋如下:
    (單核內執行緒之間切換可以幾乎達到無縫連線,
    但是在多核情況下一個執行緒 A釋放GIL 鎖,其他CPU上的執行緒都會進行競爭,
    但是有可能執行緒A 又搶到這個鎖,
    致其他幾個CPU上被喚醒後的執行緒會醒著等待到切換時間後又進入待排程狀態,
    這樣會造成執行緒顛簸(thrashing),導致效率更低.
  5. 多核CPU和C 語言相比,python的多執行緒效率並不高.解釋如下:
    1.釋放GIL,和切換執行緒 需要消耗資源
    2.一個程序只能執行一個執行緒 (拿到GIL的執行緒才能執行)

GIL 的釋放條件

  1. 使用計時器(執行時間達到閾值後,當前執行緒釋放GIL),這樣對CPU密集型程式更加友好,但依然沒有解決GIL導致的同 一時間只能執行一個執行緒的問題,所以效率依然不盡如人意。
  2. IO操作 ,這個特性是優於其他語言的,
    當有IO 操作,GIL 會釋放給其他的執行緒,避免輸入操作浪費的時間.

“python下想要充分利用多核CPU,就用多程序”,原因是什麼呢?

    先解釋下併發和並行的區別,這是我們群給舉的例子很形象,借來用用 :
   **你在聽音樂看電影併發的時候, cpu是放一下音樂停下 再放電影來回切換,
   切的很快你感覺不到, 實際上並沒有同時進行 而並行是兩個同時進行的.一遍看電影也放著音樂**

根據GIL 的特性:

  1. 每個CPU 只能執行一個執行緒
  2. 每個程序只能一個GIL,並且GIL 之間互不干擾
    所以把程序都放在各自的CPU ,由於GIL 不干擾,就可以達到並行的操作.

所以我們能夠得出結論:多核下,想做並行提升效率,比較通用的方法是使用多程序,能夠有效提高執行效率

(其實還可以在多執行緒的時候,執行緒裡的程式碼用c來寫,Python呼叫,完美解決這個問題)

有寫錯的地方和好的建議 ,請評論,謝謝 你們的瀏覽