GIL(Global Interpreter Lock),也稱爲全局解釋器,看下官方解釋python
In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)數據庫
主要意思爲:安全
GIL是一個互斥鎖,它防止多個線程同時執行Python字節碼。這個鎖是必要的,主要是由於CPython的內存管理不是線程安全的bash
Python的GIL只是CPython(Python解釋器)的一個問題,那麼Python又有哪些解釋器,它們也存在和CPython一樣的問題嗎?那麼什麼又是解釋器呢?網絡
什麼是解釋器多線程
咱們寫的代碼計算機是如何識別的呢,計算機也擁有和人類相同的思惟和語言嗎?顯然不是的;計算機只能識別機器指令語言也就是0和1,那麼咱們編寫的程序計算機是如何識別的呢?這就是解釋器的做用了,解釋器將咱們編寫的Python代碼翻譯爲機器指令語言,Python解釋器自己也是個程序,它是解釋Python代碼的,叫作解釋器.併發
Python解釋器有哪些性能
Python內部對變量或數據對象使用了引用計數器,咱們經過計算引用個數,當個數爲0時,變量或者數據對象就被自動釋放測試
In [1]: import sys
In [2]: count_var = "test1"
In [3]: sys.getrefcount(count_var)
Out[3]: 2
In [4]: add_var = count_var
In [5]: sys.getrefcount(add_var)
Out[5]: 3
複製代碼
這個引用計數器須要保護,當多個線程同時修改這個值時,可能會致使內存泄漏;SO,咱們使用鎖來解決這個問題,可有時會添加多個鎖來解決,這就會致使另個問題,死鎖;ui
爲了不內存泄漏和死鎖問題,CPython使用了單鎖,即全局解釋器鎖(GIL),即執行Python字節碼都須要獲取GIL,這能夠防止死鎖,但它有效地使任何受CPU限制的Python程序都是單線程.
程序的性能受到計算密集型(CPU)的程序限制和I/O密集型的程序限制影響,那什麼是計算密集型和I/O密集型程序呢?
計算密集型(CPU)
高度使用CPU的程序,例如: 進行數學計算,矩陣運算,搜索,圖像處理等.
I/O密集型
I/0(Input/Output)程序是進行數據傳輸,例如: 文件操做,數據庫,網絡數據等
測試下順序執行單線程和併發執行多線程的效率
- 順序執行單線程(single_thread.py)
import threading
import time
def test_counter():
i = 0
for _ in range(100000000):
i += 1
return True
def main():
start_time = time.time()
for tid in range(2):
t1 = threading.Thread(target=test_counter)
t1.start()
t1.join()
end_time = time.time()
print("Total time:{}".format(end_time-start_time))
if __name__ == "__main__":
main()
複製代碼
執行結果:
Total time: 11.299654722213745
複製代碼
- 併發執行兩個線程(multi_thread.py)
import threading
import time
def test_counter():
i = 0
for _ in range(100000000):
i += 1
return True
def main():
thread_array = {}
start_time = time.time()
for tid in range(2):
t = threading.Thread(target=test_counter)
t.start()
thread_array[tid] = t
for i in range(2):
thread_array[i].join()
end_time = time.time()
print("Total time:{}".format(end_time-start_time))
if __name__ == "__main__":
main()
複製代碼
執行結果:
Total time:13.7098388671875
複製代碼
GIL對I/O綁定多線程程序的性能影響不大,由於線程在等待I/O時共享鎖.
GIL對計算型綁定多線程程序有影響,例如: 使用線程處理部分圖像的程序,不只會因鎖定而成爲單線程,並且還會看到執行時間的增長,這種增長是由鎖的獲取和釋放開銷的結果.
有大佬試過,只能說結果不盡人意0 .0,等待着吧
Referce