84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
认证高级PHP讲师
這個比較容易理解,GIL保證python byte code在進程內同時只有一個native thread在運行。但byte code本身的邏輯仍然需要加鎖/互斥等保證線程可重入,因為byte code運行過程中任意點都可能被打斷並切換到另外的線程。
舉個簡單的例子:一段計數器的程式碼:// Step 1counter = get_counter()// Step 2counter += 1// Step 3set_counter(counter)
假設初始Counter為0,在不做任何同步的情況下兩個執行緒同時執行這段Python程式碼,期望結果應該是兩個執行緒都做了計數,最後Counter應該是2:
但由於沒有加鎖/互斥導致執行情形如下:
線程A執行完Step1時取得counter為0,這是切換到線程B
執行緒B順利執行完Step1,2,3,現在Counter為1,然後切換到A
執行緒A繼續執行完Step2得到counter為1,然後Step3設定Counter為1。
最終結果為1.
這個比較容易理解,GIL保證python byte code在進程內同時只有一個native thread在運
行。但byte code本身的邏輯仍然需要加鎖/互斥等保證線程可重入,因為byte code運行
過程中任意點都可能被打斷並切換到另外的線程。
舉個簡單的例子:
一段計數器的程式碼:
// Step 1
counter = get_counter()
// Step 2
counter += 1
// Step 3
set_counter(counter)
假設初始Counter為0,在不做任何同步的情況下兩個執行緒同時執行這段Python程式碼,
期望結果應該是兩個執行緒都做了計數,最後Counter應該是2:
但由於沒有加鎖/互斥導致執行情形如下:
線程A執行完Step1時取得counter為0,這是切換到線程B
執行緒B順利執行完Step1,2,3,現在Counter為1,然後切換到A
執行緒A繼續執行完Step2得到counter為1,然後Step3設定Counter為1。
最終結果為1.