GIL全域性直譯器鎖

2022-04-10 16:52:44 字數 2735 閱讀 7454

"""

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本質就是一把互斥鎖:將併發變成序列犧牲效率保證資料安全

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

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

為什麼不安全呢?

在python直譯器中有乙個垃圾**機制,那也是一串**,也是乙個程序,

在並行時,可能會造成乙個問題,其他執行緒變數名還沒有賦值時,垃圾**機制就將值**了

就會造成變數名找不到值

所以需要併發

gil全域性直譯器鎖是python中特有的嗎?

不是在cpython中才有

記憶體管理

引用計數:值與變數的繫結關係的個數

標記清除:當記憶體快要滿的時候 會自動停止程式的執行 檢測所有的變數與值的繫結關係

給沒有繫結關係的值打上標記,最後一次性清除

分代**:(垃圾**機制也是需要消耗資源的,而正常乙個程式的執行內部會使用到很多變數與值

並且有一部分類似於常量,減少垃圾**消耗的時間,應該對變數與值的繫結關係做乙個分類

) 新生代(5s)》青春代(10s)》老年代(20s)

垃圾**機制掃瞄一定次數發現關係還在,會將該對關係移至下一代

隨著代數的遞增 掃瞄頻率是降低的

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

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

單核情況下

開執行緒更省資源

多核情況下

開程序 10s

開執行緒 40s

四個任務 io密集型的

單核情況下

開執行緒更省資源

多核情況下

開執行緒更省資源

'''#

計算密集型

#from multiprocessing import process

#from threading import thread

#import os

#import time

#def work():

#res = 1

#for i in range(100000000):

#res *= i##

#if __name__ == '__main__':

#l =

#print(os.cpu_count()) # 4核

#start_time = time.time()##

for i in range(4):

#p = process(target=work) # 耗時10.977932214736938秒

## p = thread(target=work) # 耗時22.046306133270264秒##

p.start()

#for i in l:

#i.join()

#print(time.time() - start_time)

#io密集型

from multiprocessing import

process

from threading import

thread

import

time

import

osdef

work():

time.sleep(3)

if__name__ == '

__main__':

l =print(os.cpu_count()) #

本機4核 本機再算計算密集型就炸了

start_time =time.time()

for i in range(400):

p = process(target=work) #

耗時36.039791107177734 大部分時間浪費在開闢記憶體中間上

#p = thread(target=work) # 耗時3.0542681217193604秒

p.start()

for p in

l: p.join()

print(time.time() -start_time)

'''pythyon的多執行緒到底有沒有用

需要分情況討論

在計算密集型上python處於弱勢,但在io密集型上python還是很強的

我們以後會用到多程序+多執行緒配合使用

''''''

在開始我們也提到過gil全域性直譯器鎖本質就是一把互斥鎖

有些人就會認為有了gil鎖之後,我們在處理資料時,就不用加互斥鎖了,

實則不然,gil全域性直譯器鎖遇到io時.cpu就會剝奪其使用許可權,去執行其他的執行緒

我們在處理資料時,就會遇到io操作(比如網路延遲)所以我們需要使用到普通互斥鎖,保證資料安全

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