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

2021-09-26 09:56:09 字數 3450 閱讀 1916

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_num

print("----in work2, g_num is %d---"%g_num)

print("---執行緒建立之前g_num is %d---"%g_num)

t1 = thread(target=work1)

t1.start()

#延時一會,保證t1執行緒中的事情做完

time.sleep(1)

t2 = thread(target=work2)

t2.start()

執行結果:

---執行緒建立之前g_num is 100---

----in work1, g_num is 103---

----in work2, g_num is 103---

列表當做實參傳遞到執行緒中

from threading import thread

import time

def work1(nums):

print("----in work1---",nums)

def work2(nums):

#延時一會,保證t1執行緒中的事情做完

time.sleep(1)

print("----in work2---",nums)

g_nums = [11,22,33]

t1 = thread(target=work1, args=(g_nums,))

t1.start()

t2 = thread(target=work2, args=(g_nums,))

t2.start()

執行結果:

----in work1--- [11, 22, 33, 44]

----in work2--- [11, 22, 33, 44]

在乙個程序內的所有執行緒共享全域性變數,很方便在多個執行緒間共享資料

缺點就是,執行緒是對全域性變數隨意遂改可能造成多執行緒之間對全域性變數的混亂(即執行緒非安全)

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

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

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

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

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

多執行緒 全域性變數 共享全域性變數 多執行緒可以對全域性變數進行修改,修改後的結果會影響下乙個執行緒 程序不可以共享全域性變數,子程序是複製父程序的全域性變數,修改後互不影響 from threading import thread import time,random g num 100 def...

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

import threading import time def test1 temp print in test1 temp s str temp def test2 temp print in test2 temp s str temp g nums 11,22 def main target指...