Python 中的線程安全(threadsafe) 與 GIL

線程安全是在多線程的環境下,能夠保證多個線程同時執行時程序依舊運行正確, 而且要保證對於共享的數據可以由多個線程存取,但是同一時刻只能有一個線程進行存取。多線程環境下解決資源競爭問題的辦法是加鎖來保證存取操作的唯一性。

通常加鎖也有2種不同的粒度的鎖:
1. fine-grained(細粒度),程序員需要自行加/解鎖來保證線程安全
2. coarse-grained(粗粒度),語言層面本身維護着一個全局的鎖機制用來保證線程安全
前一種方式比較典型的是 Java, Jython 等, 後一種方式比較典型的是 CPython (即Python)。

前一種方式具體可參考 java 中的多線程編程部分,至於Python中的全局鎖機制,也即 GIL (Global Interpreter Lock)。簡單地說就是每一個interpreter進程,只能同時僅有一個線程來執行,獲得相關的鎖,存取相關的資源。那麼問題來了,如果一個interpreter進程只能有一個線程,多線程的併發則成爲不可能,即使這幾個線程之間不存在資源的競爭。
從理論上講,要儘可能地使程序更加並行,能夠充分利用多核的功能,那麼Python爲什麼要使用 GIL 來限制這種並行呢? 這個問題,長久以來已經得到了很多的討論,更多關於GIL的性能探討可以參考Python的GIL是什麼鬼,多線程性能究竟如何

當然,這也就是說Python中基本數據類型list, dict, tuple等都是線程安全的,而Jython中的多線程操作則需要手動安置同步鎖。

總體來看,解決Python中GIL遺留的歷史問題不是一個簡單工程,如果需要避開這個問題可以使用多進程的編程方式(multi process),但是這又會有進程間通信問題。依照Python自身的哲學, 簡單是一個很重要的原則,所以,使用 GIL 也是很好理解的。如果真的需要充分利用多核的速度優勢,此時python可能並非最佳選擇,可以考慮別的語言,如 java等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章