一起學Python: 多線程-共用全域變數問題

來源:互聯網
上載者:User

標籤:span   ada   log   獲得   線程   公眾   content   學習筆記   測試   

多線程-共用全域變數問題

多線程開發可能遇到的問題

假設兩個線程t1和t2都要對全域變數g_num(預設是0)進行加1運算,t1和t2都各對g_num加10次,g_num的最終的結果應該為20。

但是由於是多線程同時操作,有可能出現下面情況:

在g_num=0時,t1取得g_num=0。此時系統把t1調度為”sleeping”狀態,把t2轉換為”running”狀態,t2也獲得g_num=0
然後t2對得到的值進行加1並賦給g_num,使得g_num=1
然後系統又把t2調度為”sleeping”,把t1轉為”running”。線程t1又把它之前得到的0加1後賦值給g_num。
這樣導致雖然t1和t2都對g_num加1,但結果仍然是g_num=1
測試1

import threadingimport timeg_num = 0def work1(num):    global g_num    for i in range(num):        g_num += 1    print("----in work1, g_num is %d---"%g_num)def work2(num):    global g_num    for i in range(num):        g_num += 1    print("----in work2, g_num is %d---"%g_num)print("---線程建立之前g_num is %d---"%g_num)t1 = threading.Thread(target=work1, args=(100,))t1.start()t2 = threading.Thread(target=work2, args=(100,))t2.start()while len(threading.enumerate()) != 1:    time.sleep(1)print("2個線程對同一個全域變數操作之後的最終結果是:%s" % g_num)

運行結果:

---線程建立之前g_num is 0-------in work1, g_num is 100-------in work2, g_num is 200---2個線程對同一個全域變數操作之後的最終結果是:200

測試2

import threadingimport timeg_num = 0def work1(num):    global g_num    for i in range(num):        g_num += 1    print("----in work1, g_num is %d---"%g_num)def work2(num):    global g_num    for i in range(num):        g_num += 1    print("----in work2, g_num is %d---"%g_num)print("---線程建立之前g_num is %d---"%g_num)t1 = threading.Thread(target=work1, args=(1000000,))t1.start()t2 = threading.Thread(target=work2, args=(1000000,))t2.start()while len(threading.enumerate()) != 1:    time.sleep(1)print("2個線程對同一個全域變數操作之後的最終結果是:%s" % g_num)

運行結果:

---線程建立之前g_num is 0-------in work1, g_num is 1088005-------in work2, g_num is 1286202---2個線程對同一個全域變數操作之後的最終結果是:1286202

結論

如果多個線程同時對同一個全域變數操作,會出現資源競爭問題,從而資料結果會不正確

==================================================================

註:以上課程筆記為學習時整理的老師課堂學習筆記,如需轉載,如需完整筆記,請私聊聯絡我。

專題Python每天更新我的學習筆記。以上內容整理與上課筆記,更多詳情查看原文連結,我的公眾號乾貨持續更新中

原文連結:文章Python開發人員交流平台

如果你有更好的心得和建議,歡迎拍磚一起探討。歡迎搜尋公眾號加入【 python開發人員交流平台 】

一起學Python: 多線程-共用全域變數問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.