Python 中多執行緒共享全域性變數的問題

2021-10-24 13:29:57 字數 2859 閱讀 4107

python 中多個執行緒之間是可以共享全域性變數的資料的。

但是,多執行緒共享全域性變數是會出問題的。

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

先看例子:

'''

'''import threading

import time

g_num =

0def

work1

(num)

:global g_num

for i in

range

(num)

: g_num +=

1print

("----in work1, g_num is %d---"

% g_num)

defwork2

(num)

:global g_num

for i in

range

(num)

: g_num +=

1print

("----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 is0-

----

--in work1, g_num is

100---

----

in work2, g_num is

200-

--

2個執行緒對同乙個全域性變數操作之後的最終結果是:200

乍一看,好像沒出什麼問題。那是因為資料太小了,我們現在把資料變大。

'''

'''import threading

import time

g_num =

0def

work1

(num)

:global g_num

for i in

range

(num)

: g_num +=

1print

("----in work1, g_num is %d---"

% g_num)

defwork2

(num)

:global g_num

for i in

range

(num)

: g_num +=

1print

("----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 is0-

----

--in work2, g_num is

1048576--

----

-in work1, g_num is

1155200--

-

2個執行緒對同乙個全域性變數操作之後的最終結果是:1155200

數越大,出現問題的概率越大,而且資料的偏差也越大。

結論如果多個執行緒同時對同乙個全域性變數操作,會出現資源競爭問題,從而資料結果會不正確。

那能不能解決這個問題呢?

我們後面會講同步和互斥鎖的問題的。

通過同步和互斥鎖,我們可以解決 python 中多執行緒共享全域性變數時發生錯誤的問題。

python多執行緒 共享全域性變數

from threading import thread import time g num 100 def work1 global g num for i in range 3 g num 1 print in work1,g num is d g num def work2 global g ...

多執行緒共享變數 多執行緒共享全域性變數

1.多執行緒的執行順序是無序的 像2個人賽跑,乙個先跑乙個後跑,但根據每個人跑的速度不一樣,跑一半,二者可能跑在一起去了。2.又因為多執行緒是共享乙個全域性變數的,就導致資料容易被弄髒 假如老闆讓兩個員工寫兩個主題ppt,若這兩個人沒商量好,都做了同乙個主題的ppt,導致不但速度很慢,且這個ppt有...

Python 中多執行緒共享全域性變數的問題

在之前,我們講過了,python 中多個執行緒之間是可以共享全域性變數的資料的。但是,多執行緒共享全域性變數是會出問題的。假設兩個執行緒 t1 和 t2 都要對全域性變數g num 預設是0 進行加1運算,t1 和 t2 都各對g num加10次,g num的最終的結果應該為20。但是由於多執行緒是...