一起學Python 多執行緒 共享全域性變數問題

2022-10-11 14:30:16 字數 2127 閱讀 5604

多執行緒-共享全域性變數問題

多執行緒開發可能遇到的問題

假設兩個執行緒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 threading

import time

g_num = 0

def 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 threading

import time

g_num = 0

def 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的元組與列表類似,不同之處在於元組的元素不能修改。元組使用小括號,列表使用方括號。atuple et 77,99.9 atuple et 77,99.9 1 訪問元組 2 修改元組 說明 python中不允許修改元組的資料,包括不能刪除其中的元素。3 元組的內建函式count,index...

一起學python(三)

今天主要寫一下迴圈語句,while while else for in和for in else 1.while語句 語法 while 迴圈條件 執行語句 現在我們看一下示例如下所示 示例一 遍歷列表username username lisa nancy tom i 0 while i按照上面的 我...

一起學Python(四)

今天主要講一下,列表 字典 元組的增刪改查,以及合併 取值 1.增listdata listdata.insert len listdata 1,insertname print listdata 輸出結果為 name insertname 2.刪 listdata name 11,true lis...