天天看點

淺談并行并發與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

    歡迎交流

繼續閱讀