python多執行緒-共享全域性變數
多執行緒-共享全域性變數
import threadingimport time g_num = 200 def test1(): global g_num for i in range(5): g_num += 1 print("--test1, g_num = %d--" % g_num)def test2(): global g_num print("--test2, g_num = %d--" % g_num)if __name__ == "__main__": print("--執行執行緒之前, g_num = %d--" % g_num) t1 = threading.Thread(target=test1) t1.start() # 延時一會兒,確保執行緒t1中的事情能做 time.sleep(1) t2 = threading.Thread(target=test2) t2.start()
執行結果:
--執行執行緒之前, g_num = 200----test1, g_num = 205----test2, g_num = 205--
在上面的程式中。test1函式
迴圈五次,每次將g_num
全域性變數加一併列印g_num
的值,在test2函式
中僅僅列印g_num
的值。在t1執行緒中執行test1函式,在t2執行緒中執行test2函式,並在執行t2執行緒之前,延時一秒中來保證t1執行緒執行完畢。
列表當作實參傳遞到執行緒中
import threadingimport timedef test1(nums): nums.append(54) print("--test1, nums=", nums) g_nums = [1, 8, 9]def test2(nums): # 確保test1中執行完畢 time.sleep(1) print("--test2, nums=", nums)if __name__ == "__main__": t1 = threading.Thread(target=test1, args=(g_nums,)) t1.start() t2 = threading.Thread(target=test2, args=(g_nums,)) t2.start()
執行結果:
--test1, nums= [1, 8, 9, 54]--test2, nums= [1, 8, 9, 54]
總結
在一個程式內的所有執行緒共享全域性變數,很方便在多個執行緒間共享資料
缺點就是,執行緒是對全域性變數隨意修改可能造成多執行緒之間對全域性變數的混亂(即執行緒非安全)
多執行緒-共享全域性變數問題
多執行緒開發可能遇到的問題
假設兩個執行緒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 time g_num = 0 def test1(num): global g_num for i in range(num): g_num += 1 print("--test1, g_num = %d--" % g_num)def test2(num): global g_num for i in range(num): g_num += 1 print("--test2, g_num = %d--" % g_num)if __name__ == "__main__": print("--建立執行緒之前, g_num = %d--" % g_num) t1 = threading.Thread(target=test1, args=(100,)) t1.start() t2 = threading.Thread(target=test2, args=(100,)) t2.start() while len(threading.enumerate()) != 1: time.sleep(1) print("最終結果為:g_num=%d" % g_num)
執行結果:
--建立執行緒之前, g_num = 0----test1, g_num = 100----test2, g_num = 200--最終結果為:g_num=200
測試2
在測試1的基礎上,向test1和test2方法傳入的引數的值為:9999999
執行結果:
--建立執行緒之前, g_num = 0----test1, g_num = 13554011----test2, g_num = 13571206--最終結果為:g_num=13571206
很顯然,期待的結果為:9999999 + 9999999 = 19999998,而執行結果為:13571206。
原文出處: https://www.cnblogs.com/zhangfengxian/p/python-mthreads-global-variables.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4548/viewspace-2819101/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 多執行緒中,區域性變數與全域性變數哪個比較安全?執行緒變數
- Jmeter-全域性變數跨執行緒組使用JMeter變數執行緒
- JNI多執行緒與全域性引用執行緒
- 多執行緒中的使用共享變數的問題執行緒變數
- python 類變數 在多執行緒下的共享與釋放問題Python變數執行緒
- 多執行緒(2)-執行緒同步條件變數執行緒變數
- python全域性變數Python變數
- 10、Java併發性和多執行緒-執行緒安全與不可變性Java執行緒
- Java多執行緒/併發12、多執行緒訪問static變數Java執行緒變數
- 多執行緒06:條件變數執行緒變數
- python全域性變數與區域性變數Python變數
- 多執行緒之共享模型執行緒模型
- Jmeter將token設定為全域性變數並跨執行緒進行傳遞引數JMeter變數執行緒
- 靜態全域性變數和全域性變數變數
- python全域性變數和區域性變數, globalPython變數
- JAVA多執行緒共享資料Java執行緒
- Python中的全域性變數和區域性變數Python變數
- Python全域性變數與區域性變數詳解Python變數
- 詳解python 區域性變數與全域性變數Python變數
- python多執行緒程式設計5: 條件變數同步Python執行緒程式設計變數
- 全域性變數變數
- 全域性視角看技術-Java多執行緒演進史Java執行緒
- Python的區域性變數和全域性變數使用解惑Python變數
- python多執行緒Python執行緒
- Python 多執行緒Python執行緒
- Python的全域性和區域性變數Python變數
- node 全域性物件和全域性變數物件變數
- 全域性變數與區域性變數變數
- 區域性變數和全域性變數變數
- Python 多執行緒多程式Python執行緒
- 物件中的靜態屬性是否在多執行緒中共享物件執行緒
- 全域性 DOM 變數變數
- lua全域性變數變數
- C語言區域性變數、全域性變數、靜態區域性變數、靜態全域性變數C語言變數
- angular中定義全域性變數及全域性變數的使用Angular變數
- Python定義全域性變數的用法Python變數
- Java 多執行緒共享模型之管程(上)Java執行緒模型
- Java 共享資料讀寫(多執行緒)Java執行緒