GIL鎖物件(全域性直譯器)[面試題]
阿新 • • 發佈:2019-01-02
GIL鎖物件(全域性直譯器)[面試題]
描述Python 中GIL的概念, 以及它對python多執行緒的影響?編寫一個多執行緒抓取網頁的程式,並闡述多執行緒抓取程式是否比單執行緒單執行緒效能有提升,並解釋原因。
#1.多執行緒 #子執行緒死迴圈 import threading def test(): while True: pass t1 = threading.Thread(target=test) t1.start() #2.主執行緒 while True: pass #3.多程序 import multiprocessing def deadLoop(): while True: pass #子程序死迴圈 p1 = multiprocessing.Process(target=deadLoop) p1.start()
由上述程式碼可知:多執行緒的併發其實並不是實現了真正意義上的併發。
GIL鎖物件是指全域性直譯器鎖。每個執行緒在執行的過程都需要先獲取GIL,保證同一時刻只有一個執行緒可以執行程式碼。而 cpython直譯器中存在一個GIL(全域性直譯器鎖),他的作用就是保證同一時刻只有一個執行緒可以執行程式碼。
結論:
1. 在 處理像科學計算 這類需要持續使用cpu的任務的時候 單執行緒會比多執行緒快
2. 在 處理像IO操作等可能引起阻塞的這類任務的時候 多執行緒會比單執行緒
如何實現多執行緒的併發,即如何解決GIL(全域性直譯器)?
1、更換直譯器 比如使用jpython(java實現的python直譯器);
2、使用多程序完成多工的處理。