首頁  >  文章  >  後端開發  >  Python中GIL全域解釋器鎖的實作方式及原理解析

Python中GIL全域解釋器鎖的實作方式及原理解析

PHPz
PHPz轉載
2023-04-26 15:16:081412瀏覽

1.為什麼有GIL

設計者為了規避類似於記憶體管理這樣的複雜的競爭風險問題(race condition)

因為CPython 大量使用C 語言庫,但大部分C語言庫都不是原生線程安全的(線程安全會降低效能和增加複雜度)

2.GIL 是如何工作的

多個執行緒執行時,每一個執行緒在開始執行時,都會鎖住GIL,以阻止別的線程執行,同樣的,每一個線程執行完一段後,會釋放GIL,以允許別的線程開始利用資源

CPython 中還有另一個機制,叫做check_interval, CPython 解釋器會去輪詢檢查線程GIL 的鎖住情況.每隔一段時間,Python 解釋器就會強制當前線程去釋放GIL,這樣別的線程才能有執行的機會

for (;;) {
    if (--ticker < 0) {
        ticker = check_interval;
    
        /* Give another thread a chance */
        PyThread_release_lock(interpreter_lock);
    
        /* Other threads may run now */
    
        PyThread_acquire_lock(interpreter_lock, 1);
    }
 
    bytecode = *next_instr++;
    switch (bytecode) {
        /* execute the next instruction ... */ 
    }
}

3.python的執行緒安全性

有了GIL,任然在程式設計時需要考慮執行緒安全性

4.如何如何繞過GIL?

繞過CPython,使用JPython(Java 實作的Python解釋器)等別的實作
把關鍵效能程式碼,放到別的語言(一般是C )實作

# 5.在處理cpu密集型任務時,為什麼有時候使用多執行緒會比單執行緒還要慢些?

GIL採用輪流運行線程的機制,GIL需要在線程之間不斷輪流進行切換,線程如果多或者運行時間較長,切換帶來的性能損失可能超過單線程

6 .你覺得GIL 是個好的設計嗎?

事實上,在 Python 3 之後,確實有很多關於 GIL 改進甚至是取消的討論,你的看法是什麼呢?你在平常工作中有被 GIL 困擾過的場景嗎?

GIL任然是一個好的設計雖然損失了性能,但在保證資源不會衝突和預防死鎖方面有一定作用

以上是Python中GIL全域解釋器鎖的實作方式及原理解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除