一、多執行緒共享全域變數
首先我們來回憶下在函式中修改全域變數的情況,
在一個函式中,對全域變數進行修改的時候,到底是否需要使用 global 進行說明,要看是否對全域變數的執行指向進行了修改,
如果修改了執行指向,即讓全域變數指向了一個新的地方,那么必須使用 global,
如果僅僅是修改了指向的空間中的資料,此時不是必須要使用 global,
我們來看一個例子,在這個例子中,讓一個子執行緒對全域變數 +1 操作,另一個子執行緒只列印全域變數,看看資料是否共享,
from threading import Thread
import time
g_num = 100
def work1():
global g_num
g_num += 1
print("----in work1, g_num is %d---" % g_num)
def work2():
print("----in work2, g_num is %d---" % g_num)
def main():
print("---執行緒創建之前g_num is %d---" % g_num)
t1 = Thread(target=work1)
t1.start()
# 延時一會,保證t1執行緒中的事情做完
time.sleep(1)
t2 = Thread(target=work2)
t2.start()
time.sleep(1)
print("---執行緒創建之后g_num is %d---" % g_num)
if __name__ == "__main__":
main()
如果子執行緒2列印出來的結果是100,說明全域變數不共享,
如果子執行緒2列印出來的資料是101,說明全域變數共享,
運行結果:
---執行緒創建之前g_num is 100---
----in work1, g_num is 101---
----in work2, g_num is 101---
---執行緒創建之后g_num is 101---
上面的例子說明,多執行緒是共享全域變數的,
二、串列當做實參傳遞到執行緒中
在上面,我們驗證了多執行緒之間是共享全域變數的,
我們也可以將變數當作實參傳遞到執行緒中,來驗證多執行緒中是共享資料的,
from threading import Thread
import time
def work1(nums):
nums.append(44)
print("----in work1---", nums)
def work2(nums):
print("----in work2---", nums)
g_nums = [11, 22, 33]
t1 = Thread(target=work1, args=(g_nums,))
t1.start()
# 延時一會,保證t1執行緒中的事情做完
time.sleep(1)
t2 = Thread(target=work2, args=(g_nums,))
t2.start()
運行結果:
----in work1--- [11, 22, 33, 44]
----in work2--- [11, 22, 33, 44]
那為什么多個執行緒之間要共享全域變數,有什么好處么?
因為多任務往往配合使用,
在一個行程內的所有執行緒共享全域變數,就可以很方便在多個執行緒間共享資料,
缺點就是,執行緒是對全域變數隨意修改可能造成多執行緒之間對全域變數的混亂(即執行緒非安全),

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/117846.html
標籤:其他
