Python内部是如何存储GC引用变量的计数的?
PHP中文网
PHP中文网 2017-04-18 10:08:49
0
1
494
PHP中文网
PHP中文网

认证高级PHP讲师

全部回覆(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:

但由於沒有加鎖/互斥導致執行情形如下:

  1. 線程A執行完Step1時取得counter為0,這是切換到線程B

  2. 執行緒B順利執行完Step1,2,3,現在Counter為1,然後切換到A

  3. 執行緒A繼續執行完Step2得到counter為1,然後Step3設定Counter為1。

最終結果為1.

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!