Python中GIL全局解釋鎖的實現(xiàn)
GIL(Global Interpreter Lock,即全局解釋器鎖)
1.為什么有GIL
設計者為了規(guī)避類似于內(nèi)存管理這樣的復雜的競爭風險問題(race condition)
因為 CPython 大量使用 C 語言庫,但大部分C語言庫都不是原生線程安全的(線程安全會降低性能和增加復雜度)
2.GIL 是如何工作的
多個線程執(zhí)行時,每一個線程在開始執(zhí)行時,都會鎖住 GIL,以阻止別的線程執(zhí)行,同樣的,每一個線程執(zhí)行完一段后,會釋放 GIL,以允許別的線程開始利用資源
CPython 中還有另一個機制,叫做 check_interval, CPython 解釋器會去輪詢檢查線程 GIL 的鎖住情況.每隔一段時間,Python 解釋器就會強制當前線程去釋放 GIL,這樣別的線程才能有執(zhí)行的機會
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 實現(xiàn)的Python解釋器)等別的實現(xiàn)
把關鍵性能代碼,放到別的語言(一般是 C++)中實現(xiàn)
5.在處理cpu密集型任務時,為什么有時候使用多線程會比單線程還要慢些?
GIL采用輪流運行線程的機制,GIL需要在線程之間不斷輪流進行切換,線程如果多或者運行時間較長,切換帶來的性能損失可能超過單線程
6 .你覺得 GIL 是一個好的設計嗎?
事實上,在 Python 3 之后,確實有很多關于 GIL 改進甚至是取消的討論,你的看法是什么呢?你在平常工作中有被 GIL 困擾過的場景嗎?
GIL任然是一個好的設計雖然損失了性能,但在保證資源不會沖突和預防死鎖方面有一定作用
到此這篇關于Python中GIL全局解釋鎖的實現(xiàn)的文章就介紹到這了,更多相關Python GIL全局解釋鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python中數(shù)字列表轉(zhuǎn)化為數(shù)字字符串的實例代碼
先前學習過,數(shù)字和字符串都可以存儲到變量當中,下面這篇文章主要給大家介紹了關于python中數(shù)字列表轉(zhuǎn)化為數(shù)字字符串的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-02-02
出現(xiàn)module 'queue' has no attrib
這篇文章主要介紹了出現(xiàn)module 'queue' has no attribute 'Queue'問題的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
Python基于分析Ajax請求實現(xiàn)抓取今日頭條街拍圖集功能示例
這篇文章主要介紹了Python基于分析Ajax請求實現(xiàn)抓取今日頭條街拍圖集功能,涉及Python針對今日頭條URL請求與json數(shù)據(jù)處理相關操作技巧,需要的朋友可以參考下2018-07-07
Python實現(xiàn)TXT數(shù)據(jù)轉(zhuǎn)三維矩陣
在數(shù)據(jù)處理和分析中,將文本文件中的數(shù)據(jù)轉(zhuǎn)換為三維矩陣是一個常見的任務,本文將詳細介紹如何使用Python實現(xiàn)這一任務,感興趣的小伙伴可以了解下2024-01-01
數(shù)據(jù)挖掘之Apriori算法詳解和Python實現(xiàn)代碼分享
這篇文章主要介紹了數(shù)據(jù)挖掘之Apriori算法詳解和Python實現(xiàn)代碼分享,本文先是對Apriori算法做了詳細介紹,然后給出了Python版實現(xiàn)代碼,需要的朋友可以參考下2014-11-11

