read.cash Log in
h@hbkedge more from that month

龍家俊教你 python day 51 線程之間共享全局變量數據出現錯誤問題 需求: 定義兩個函數,實現循環100萬次,每循環一次給全局變量加1 創建兩個子線程執行對應的兩個函數,查看計算後的結果 import threading # 定義全局變量 g_num = 0 # 循環一次給全局變量加1 def sum_num1(): for i in range(1000000): global g_num g_num += 1 print("sum1:", g_num) # 循環一次給全局變量加1 def sum_num2(): for i in range(1000000): global g_num g_num += 1 print("sum2:", g_num) if __name__ == '__main__': # 創建兩個線程 first_thread = threading.Thread(target=sum_num1) second_thread = threading.Thread(target=sum_num2) # 啟動線程 first_thread.start() # 啟動線程 second_thread.start() 執行結果: sum1: 1210949 sum2: 1496035 注意點: 多線程同時對全局變量操作數據發生了錯誤 錯誤分析: 兩個線程first_thread和second_thread都要對全局變量g_num(默認是0)進行加1運算,但是由於是多線程同時操作,有可能出現下面情況: 在g_num=0時,first_thread取得g_num=0。此時系統把first_thread調度為”sleeping”狀態,把second_thread轉換為”running”狀態,t2也獲得g_num=0 然後second_thread對得到的值進行加1並賦給g_num,使得g_num=1 然後系統又把second_thread調度為”sleeping”,把first_thread轉為”running”。線程t1又把它之前得到的0加1後賦值給g_num。 這樣導致雖然first_thread和first_thread都對g_num加1,但結果仍然是g_num=1 全局變量數據錯誤的解決辦法: 線程同步: 保證同一時刻只能有一個線程去操作全局變量 同步: 就是協同步調,按預定的先後次序進行運行。 線程同步的方式: 線程等待(join) 互斥鎖 線程等待的示例代碼: import threading # 定義全局變量 g_num = 0 # 循環1000000次每次給全局變量加1 def sum_num1(): for i in range(1000000): global g_num g_num += 1 print("sum1:", g_num) # 循環1000000次每次給全局變量加1 def sum_num2(): for i in range(1000000): global g_num g_num += 1 print("sum2:", g_num) if __name__ == '__main__': # 創建兩個線程 first_thread = threading.Thread(target=sum_num1) second_thread = threading.Thread(target=sum_num2) # 啟動線程 first_thread.start() # 主線程等待第一個線程執行完成以後代碼再繼續執行,讓其執行第二個線程 # 線程同步: 一個任務執行完成以後另外一個任務才能執行,同一個時刻只有一個任務在執行 first_thread.join() # 啟動線程 second_thread.start() 執行結果: sum1: 1000000 sum2: 2000000

No comments yet

Log in to join in Reading is open to everyone. Replying needs an account.