GIL全域性直譯器鎖

2022-08-18 03:03:14 字數 2067 閱讀 5358

"""

in cpython, the global interpreter lock, or gil, is a mutex that prevents multiple

native threads from executing python bytecodes at once. this lock is necessary mainly

because cpython』s memory management is not thread-safe.

""""""

ps:python直譯器有很多種 最常見的就是cpython直譯器

gil本質也是一把互斥鎖:將併發變成序列犧牲效率保證資料的安全

用來阻止同乙個程序下的多個執行緒的同時執行(同乙個程序內多個執行緒無法實現並行但是可以實現併發)

python的多執行緒沒法利用多核優勢 是不是就是沒有用了?

gil的存在是因為cpython直譯器的記憶體管理不是執行緒安全的

垃圾**機制

1.引用計數

2.標記清除

3.分代**

研究python的多執行緒是否有用需要分情況討論

四個任務 計算密集型的 10s

單核情況下

開執行緒更省資源

多核情況下

開程序 10s

開執行緒 40s

四個任務 io密集型的

單核情況下

開執行緒更節省資源

多核情況下

開執行緒更節省資源

#

計算密集型

from multiprocessing import

process

from threading import

thread

import

os,time

defwork():

res=0

for i in range(100000000):

res*=i

if__name__ == '

__main__':

l=print(os.cpu_count()) #

本機為6核

start=time.time()

for i in range(6):

#p=process(target=work) #耗時 4.732933044433594

p=thread(target=work) #

耗時 22.83087730407715

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=print(os.cpu_count()) #

本機為6核

start=time.time()

for i in range(4000):

p=process(target=work) #

耗時9.001083612442017s多,大部分時間耗費在建立程序上

#p=thread(target=work) #耗時2.051966667175293s多

p.start()

for p in

l:p.join()

stop=time.time()

print('

run time is %s

' %(stop-start))

"""python的多執行緒到底有沒有用

需要看情況而定 並且肯定是有用的

多程序+多執行緒配合使用

"""

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...