GIL全域性直譯器鎖

2022-09-02 18:39:12 字數 2167 閱讀 6069

gil全域性直譯器鎖

1. 什麼是gil全域性直譯器鎖

gil本質就是一把互斥鎖,相當於執行許可權,每個程序內都會存在一把gil,同一程序內的多個執行緒

必須搶到gil之後才能使用cpython直譯器來執行自己的**,即同一程序下的多個執行緒無法實現並行

但是可以實現併發

在cpython直譯器下,如果想實現並行可以開啟多個程序

2. 為何要有gil

因為cpython直譯器的垃圾**機制不是執行緒安全的

3. 如何用gil

有了gil,應該如何處理併發

程序:資源單位

執行緒:**的執行過程

互斥鎖:把多個任務對共享資料的修改,由併發變成序列,犧牲效率保證資料安全

from threading import thread  #

執行緒import

time

deftask(name):

print('

%s is running

' %name)

time.sleep(2)

if__name__ == '

__main__':

t1=thread(target=task,args=('

執行緒1'

,)) t2=thread(target=task,args=('

執行緒2'

,)) t3=thread(target=task,args=('

執行緒3'

,)) t1.start()

t2.start()

t3.start()

結果:執行緒1

isrunning

執行緒2

isrunning

執行緒3

is running

舉例計算密集型:應該使用多程序

from multiprocessing import

process

from threading import

thread

import

os,time

defwork():

res=0

for i in range(10000):

res*=i

if__name__ == '

__main__':

l=#print(os.cpu_count())

start=time.time()

for i in range(6):

p=process(target=work) #

run time is 1.0090382099151611

#p=thread(target=work) #run time is 0.012500286102294922

p.start()

for p in

l: p.join()

stop=time.time()

print('

run time is %s

' %(stop-start))

舉例io密集型:應該使用多執行緒

from multiprocessing import

process

from threading import

thread

import

threading

import

os,time

defwork():

time.sleep(2)

if__name__ == '

__main__':

l=start=time.time()

for i in range(100):

p=process(target=work) #

41.31889200210571

#p=thread(target=work) #2.0850322246551514

p.start()

for p in

l: p.join()

stop=time.time()

print('

run time is %s

' %(stop-start))

舉例

GIL 全域性直譯器鎖

1 描述python中gil的概念,以及它對python多執行緒的影響?編寫乙個多執行緒抓取網頁的程式,並闡明多執行緒抓取程式是否可比單執行緒效能有提公升,並解釋原因。答 gil global interpreter lock,即全域性直譯器鎖 1 python語言和gil沒有半毛錢關係。僅僅是由於...

GIL全域性直譯器鎖

gil 啥?他是如何產生的?gil產生的背景 在cpython解釋內部執行多個執行緒的時候,每個執行緒都需要直譯器內部申請相應的全域性資源,由於c語言本身比較底層造成cpython在管理所有全域性資源的時候並不能應對所有執行緒同時的資源請求,因此為了防止資源競爭而發生錯誤,對所有執行緒申請全域性資源...

全域性直譯器鎖GIL

我們使用高併發,一次是建立1萬個執行緒去修改乙個數並列印結果看現象 from threading import thread import osdef func args global n n args print n,os.getpid n 100t list for i in range 100...