1. 程式人生 > >淺談並行併發與python的GIL鎖

淺談並行併發與python的GIL鎖

併發和並行

什麼是併發什麼是並行,他們的區別是什麼?

你吃飯吃到一半,電話來了,你一直到吃完了以後才去接,這就說明你不支援併發也不支援並行.

你吃飯吃到一半,電話來了,你停了下來接了電話,接完後電話以後繼續吃飯,這說明你支援併發。

你吃飯吃到一半,電話來了,你一邊打電話一邊吃飯,這說明你支援並行。

併發:交替處理多個任務的能力

並行:同時處理多個任務的能力

併發的關鍵是你有處理多個任務的能力,不一定要同時。

並行的關鍵是你有同時處理多個任務的能力,強調的是同時.

所以它們最大的區別就是:是否是『同時』處理任務。

GIL(全域性直譯器鎖)

GIL是什麼:一個防止多執行緒併發執行機器碼的一個Mutex

  一個程序裡只有一個GIL鎖,執行緒只能拿到GIL鎖才能執行,所以python多執行緒的假的

     

           首先需要明確的一點是GIL並不是Python的特性,它是在實現Python解析器(CPython)時所引入的一個概念。就好比C++是一套語言(語法)標準,但是可以用不同的編譯器來編譯成可執行程式碼。Python的程式碼可以通過CPython,PyPy,Psyco等不同的Python執行環境來執行。像其中的JPython就沒有GIL。然而因為CPython是大部分環境下預設的Python執行環境。

           GIL鎖是歷史遺留下來的問題,上世紀九十年代python創始人“龜叔”,為了解決執行緒安全問題寫的一個鎖。

           官方給出的解釋大概就是: 在CPython,全域性直譯器鎖,是一個互斥鎖,它阻止多執行緒同時執行Python位元組碼。這個鎖是必要的,主要是因為CPython的記憶體管理不是執行緒安全的。(然而,由於GIL的存在,其他特徵已經發展成依賴於它所實施的保證。)  =========》 意思就是 :在Cpython直譯器中這個GIL鎖基本不能移除

問題:描述Python GIL的概念, 以及它對python多執行緒的影響?闡明多執行緒抓取程式是否可比單執行緒效能有提升,並解釋原因。
參考答案:
  1. Python語言和GIL沒有半毛錢關係。僅僅是由於歷史原因在Cpython虛擬機器(直譯器),難以移除GIL。
  2. GIL:全域性直譯器鎖。每個執行緒在執行的過程都需要先獲取GIL,保證同一時刻只有一個執行緒可以執行程式碼。
  3. 執行緒釋放GIL鎖的情況: 在IO操作等可能會引起阻塞的system call之前,可以暫時釋放GIL,但在執行完畢後,必須重新獲取GIL Python 3.x使用計時器(執行時間達到閾值後,當前執行緒釋放GIL)或Python 2.x,tickets計數達到100
  4. Python使用多程序是可以利用多核的CPU資源的。
  5. 多執行緒爬取比單執行緒效能有提升,因為遇到IO阻塞會自動釋放GIL鎖
解決GIL鎖方法:
1:更換直譯器 比如使用jpython(java實現的python直譯器)
2:使用多程序完成多工的處理

結論:

       1. 在 處理像科學計算 這類需要持續使用cpu的任務的時候 單執行緒會比多執行緒快

      2. 在 處理像IO操作等可能引起阻塞的這類任務的時候 多執行緒會比單執行緒快

    聯絡方式

    QQ:1217675462

    歡迎交流