我們使用高併發,一次是建立1萬個執行緒去修改乙個數並列印結果看現象:
from threading importthread
import
osdef
func(args):
global
n n =args
(n, os.getpid())
n = 100t_list =
for i in range(10000):
t = thread(target=func, args=(i,))
t.start()
for t in
t_list:
t.join()
print(n)
我們可以看到,雖然是高併發,但是沒有一條資料是重複的,為什麼?因為python直譯器裡面有全域性直譯器鎖gil,會讓直譯器每一時刻只有乙個執行緒在執行,這樣就保證了資料的安全了。
從這裡我們也看出了,因為有全域性直譯器鎖的存在就導致**的執行效率的變慢問題,導致多執行緒不能充分利用cpu,不管是4核8核16核,都只有乙個執行緒在裡面執行。但是這並不是python語言的問題,這是cpython直譯器的特性問題,使用jpython直譯器就沒有全域性鎖,就不會導致執行效率的問題了。
高cpu:高計算類——高cpu使用率
高io:
我們大部分寫的**都是高io的,真正用到高cpu的實際上很少。
而且python的這個弊端並沒有影響python的火爆程度,python的優勢比如爬蟲,處理we請求,他們都不受這個gil的影響。
所以在多執行緒中,遇到io就切掉,讓給其他執行緒去使用。
如果真要用高cpu我們可是使用多程序來處理,比如有4,8,16個核的cpu。
GIL 全域性直譯器鎖
1 描述python中gil的概念,以及它對python多執行緒的影響?編寫乙個多執行緒抓取網頁的程式,並闡明多執行緒抓取程式是否可比單執行緒效能有提公升,並解釋原因。答 gil global interpreter lock,即全域性直譯器鎖 1 python語言和gil沒有半毛錢關係。僅僅是由於...
GIL全域性直譯器鎖
gil 啥?他是如何產生的?gil產生的背景 在cpython解釋內部執行多個執行緒的時候,每個執行緒都需要直譯器內部申請相應的全域性資源,由於c語言本身比較底層造成cpython在管理所有全域性資源的時候並不能應對所有執行緒同時的資源請求,因此為了防止資源競爭而發生錯誤,對所有執行緒申請全域性資源...
GIL 全域性直譯器鎖
對gil的理解 每個執行緒在執行的過程中都需要先獲取gil,保證同一時刻只有乙個執行緒可以執行 多程序和多執行緒 因為gil的問題導致系統中同一時間點只能有乙個執行緒被直譯器解釋,這就導致了執行緒無法實現並行,無法充分的利用我們 計算機的多核 資源,python所謂的多執行緒程式設計就類似於單核cp...