標籤: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: 多線程-共用全域變數問題