什麼是 Python 全域性直譯器鎖 (GIL)
在本文中,我們將學習什麼是 Python 全域性直譯器鎖 (GIL)。
這是一種鎖或障礙,它阻止 Python 直譯器同時被多個執行緒訪問。GIL 被認為是 Python 3.x 或更早版本中的一個缺陷/問題,因為它不允許在多執行緒架構中進行多執行緒操作。
為什麼引入它?
Python 支援自動垃圾回收的概念。一旦物件的引用計數達到零,記憶體就會被清理並釋放以供使用。
>>> import sys
>>> var = {}
>>> print(sys.getrefcount(ar))
>>> 2
>>> v=var
>>> print(sys.getrefcount(v))
>>> 3在這種情況下,如果引用計數開始同時減少和增加,自動收集器將無法正常工作,因此記憶體洩漏的可能性會增加。
為了降低這種風險,在 Python 中引入了 GIL。新增全域性鎖被認為比向每個變數新增鎖更好,後者會導致一系列鎖,從而導致死鎖。

為什麼 GIL 仍然存在於 Python 中
GIL 需要改進,以便我們能夠更好地處理它。因此,我們正在努力改進 GIL 的概念,而不是刪除 GIL。由於 Python 與 C 和 CPython 的基礎完全相關,因此我們無法直接刪除 Gil。雖然有各種方法可以處理 GIL 解決的問題,但這些方法難以實現,並且會降低系統的處理和執行時間。
例如:
假設程序 P1 正在執行,並且具有執行緒 t1 和 t2。Python 執行緒本質上是本地的,由底層作業系統排程。
t1 執行(執行階段)(獲取 GIL)→ t1 等待 I/O(輸入/輸出)(釋放 GIL)→ t2 執行(執行階段)(獲取 GIL,此時 t1 也已準備好執行,但 GIL 被 t2 獲取)
因此,在這裡 GIL 成為主要的限制因素。因此,如果我們想要編寫一個執行大量 CPU 密集型操作的多執行緒 Python 應用程式/模組,則無法獲得所需的結果。
因為,在 Python 中,真正的多執行緒是不可能的,因為即使多核 CPU 可用,程序實際上也只會同時利用一個 CPU。
但是,在大多數 Python 應用程式(Web 應用程式、基於 Django 的伺服器等)中,這並不是問題,因為這些應用程式本質上是 I/O 繫結的。
作為 Python 程式設計師,我們不必處理獲取和釋放 GIL,除非我們正在編寫在 Python 中可執行的 C/C++ 模組/指令碼。
結論
在本文中,我們學習了 Python 全域性直譯器鎖、其重要性以及為什麼不能直接從 Python 中刪除它。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP