《Python面試每日一題》之GIL

問題描述:

描述Python GIL的概念,以及它對Python多線程的影響?
闡明多線程爬蟲程序是否比單線程性能有提升,並解釋原因。

答:

GIL(Global Interpreter Lock)全稱爲全局解釋器鎖,是一個防止解釋器多線程併發執行機器碼的一個全局互斥鎖。其存在主要是因爲在機器碼執行過程中,Cpython(使用C語言編寫的Python解釋器)的內存管理不是線程安全的
所以,當每個線程在執行時都需要先獲取GIL,保證同一時刻只有一個線程可以執行機器碼。
因此,當使用Cpython解釋器解釋多線程程序時,爲了保證線程安全,即共享資源的原子性。默認使用了一個GIL,導致多線程實際是“僞多線程”。
程序分爲計算密集型程序I/O密集型程序
計算密集型程序的特點是沒有延時和阻塞,整段機器碼幾乎都用於計算的功能。
I/O密集型程序的特點是存在延時或堵塞,程序的功能主要是實現收發數據。
Cpython解釋計算密集型程序時,多線程和單線程在運行時效上沒有明顯的區別,不過在解釋I/O密集型程序時,多線程還是比單線程更快。因爲在多線程中,當程序遇到堵塞或延時時,當前線程會釋放GIL,讓其他線程獲取,因此多線程爬蟲程序是比單線程程序在性能上有提升。

Python 3.2開始使用新的GIL釋放機制。在新的GIL實現中,用一個固定的超時時間來指示當前的線程放棄全局鎖。在當前線程保持這個鎖,且其他線程請求這個鎖的時候,當前線程就會在5ms後被強制釋放掉這個鎖。

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