解決多執行緒之間資料完整性和狀態同步的最簡單方法自然就是加鎖。
gil的全名,global interpreter lock
。
解釋:這個鎖就是用來為了解決cpython多執行緒中線程不安全問題引入的乙個全域性排它鎖,它的作用就是在多執行緒情況下,保護共享資源,為了不讓多個執行緒同時操作共享資源,導致不可預期的結果而加上的鎖,在乙個執行緒操作共享資源時,其他執行緒請求該資源,只能等待gil解鎖。這個設定在cpython剛引入多執行緒概念的時候就有了,然後後續的各種包和元件開發都不可避免的受到了gil的影響,所以有人會說,python在多執行緒處理的時候很慢。
照此理解,參看以下**:
#-*-coding:utf-8-*-
total =0
def add():
global total
for i in range(1000000):
total += 1
def desc():
global total
for i in range(1000000):
total -= 1
import threading
thread1 = threading.thread(target=add)
thread2 = threading.thread(target=desc)
thread1.start()
thread2.start()
print(total)
輸出結果不為定值0,每次執行結果均不一致。
出現這種問題的原因是什麼呢?
python的gil鎖的釋放
python中的乙個執行緒對應於c語言中的乙個執行緒,gil使得同一時刻只有乙個執行緒在乙個cpu上執行,無法將多個執行緒對映到多個cpu上執行;為解決這種不能充分利用cpu效能的問題,gil會有釋放的機制,根據執行的位元組碼行數以及時間片段會釋放gil,在遇到io操作時也會主動釋放。
#-*-coding:utf-8-*-
total =0
def add():
global total
for i in range(1000000):
total += 1
def desc():
global total
for i in range(1000000):
total -= 1
import threading
thread1 = threading.thread(target=add)
thread2 = threading.thread(target=desc)
thread1.start()
thread1.join()
thread2.start()
thread2.join()
print(total)
此時輸出結果為:0
因為:thread.join()會檢驗執行緒池中的執行緒是否結束,沒有結束就阻塞直到執行緒結束,如果結束則跳轉執行下乙個執行緒的join函式。
python GIL全域性直譯器鎖
什麼是gil python 的執行由python 虛擬機器 也叫直譯器主迴圈,cpython版本 來控制,python 在設計之初就考慮到要在直譯器的主迴圈中,同時只有乙個執行緒在執行,即在任意時刻,只有乙個執行緒在直譯器中執行。對python 虛擬機器的訪問由全域性直譯器鎖 gil 來控制,正是這...
python GIL 全域性直譯器鎖
在vmware虛擬軟體中將ubuntu設定為單核cpu 主線程死迴圈,佔滿cpu while true pass在vmware虛擬軟體中將ubuntu設定為雙核cpu import threading 子執行緒死迴圈 deftest while true pass t1 threading.thre...
python GIL(全域性直譯器鎖)
cpython直譯器中存在乙個gil 全域性直譯器鎖 他的作用就是保證同一時刻只有乙個執行緒可以執行 因此造成了我們使用多執行緒的時候無法實現並行 每個執行緒在執行的過程都需要先獲取gil,保證同一時刻只有乙個執行緒可以執行 執行緒釋放gil鎖的情況 在io操作等可能會引起阻塞的system cal...