問:為什么python中有了全局解釋器鎖GIL,還要有互斥鎖?


  首先我們在進行對比之前,我們要知道什么是全局解釋器鎖,和什么是互斥鎖,他們分別是用來做什么的才能解決這個問題。

  

  首先介紹全局解釋解釋器鎖GIL,Python代碼的執行由Python 虛擬機(也叫解釋器主循環,CPython版本)來控制,Python 在設計之初就考慮到要在解釋器的主循環中,同時只有一個線程在執行,即在任意時刻,只有一個線程在解釋器中運行。對Python 虛擬機的訪問由全局解釋器鎖(GIL)來控制,正是這個鎖能保證同一時刻只有一個線程在運行。從宏觀微觀上來說,GIL是宏觀的操作。比如在一個4核的環境下,只有一個核是運行着線程,而其他三個核是空的。GIL是線程鎖,針對線程,而不是進程。然而這些規則是Cpython給的,像Jpython就沒有這個機制。

  其中,在多線程的情況下,python虛擬機按以下方式執行:

  1. 設置GIL
  2. 切換到一個線程去運行
  3. 運行:
      a. 指定數量的字節碼指令,或者
      b. 線程主動讓出控制(可以調用time.sleep(0))
  4. 把線程設置為睡眠狀態
  5. 解鎖GIL
  6. 再次重復以上所有步驟
 
 
  接下來是互斥鎖:個線程要共享數據時,先將其鎖定,此時資源的狀態為“鎖定”,其他線程不能更改;直到該線程釋放資源,將資源的狀態變成“非鎖定”,其他的線程才能再次鎖定該資源。互斥鎖保證了每次只有一個線程進入寫入操作,從而保證了多線程情況下數據的正確性。互斥鎖體現的就是一個同步的機制,即該線程釋放資源就是一個條件,條件完成,才能執行下一步操作。是微觀的操作。
  好像,這樣就能說明兩者的區別了。。。后續補充--


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM