gil的作用是,對於乙個直譯器,只能有乙個thread在執行bytecode。所以任何時刻只有一條bytecode在被乙個thread執行。python的多執行緒並不是嚴格意義上的並行執行,gil在bytecode層面上保證了thread safe,但是python多執行緒包裡依然提供了加鎖機制,這是為何?
假設有個操作,比如x += 1
,這個操作需要多個bytecodes操作,在執行這個操作的多條bytecodes期間,可能會發生thread切換,這樣就出現了執行緒競爭的情況。
比如以下案例:
1234567
891011
>>> def f():... global num
... num += 1
...>>> dis.dis(f)
3 0 load_global 0 (num)
3 load_const 1 (1)
6 inplace_add
7 store_global 0 (num)
10 load_const 0 (none)
13 return_value
分析以上可知,要實現num += 1
操作總共使用了4條bytecodes。gil並不能保證此操作的原子性,在load_global
和store_global
執行之間,有可能發生執行緒切換。
執行緒同步與互斥 互斥鎖
在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...
執行緒同步與互斥 互斥鎖
在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...
Python GIL 全域性解析器鎖和互斥鎖
首先要明白什麼是gil鎖,gil鎖是python直譯器中保證在乙個程序中只要乙個執行緒在執行的鎖,它保障了整個python執行只有乙個執行緒,即使你開了多執行緒任務,它只能是併發而不是並行,而為什麼有了這個保障只有乙個執行緒執行的鎖之後還要有互斥鎖呢,是因為在python的多執行緒任務中,多個執行緒...