1. 程式人生 > >GIL鎖物件(全域性直譯器)[面試題]

GIL鎖物件(全域性直譯器)[面試題]

			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、使用多程序完成多工的處理。