設計者為了規避類似於記憶體管理這樣的複雜的競爭風險問題(race condition)
因為CPython 大量使用C 語言庫,但大部分C語言庫都不是原生線程安全的(線程安全會降低效能和增加複雜度)
多個執行緒執行時,每一個執行緒在開始執行時,都會鎖住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 ... */ } }
有了GIL,任然在程式設計時需要考慮執行緒安全性
繞過CPython,使用JPython(Java 實作的Python解釋器)等別的實作
把關鍵效能程式碼,放到別的語言(一般是C )實作
GIL採用輪流運行線程的機制,GIL需要在線程之間不斷輪流進行切換,線程如果多或者運行時間較長,切換帶來的性能損失可能超過單線程
事實上,在 Python 3 之後,確實有很多關於 GIL 改進甚至是取消的討論,你的看法是什麼呢?你在平常工作中有被 GIL 困擾過的場景嗎?
GIL任然是一個好的設計雖然損失了性能,但在保證資源不會衝突和預防死鎖方面有一定作用
以上是Python中GIL全域解釋器鎖的實作方式及原理解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!