Python 中多個執行緒之間是共享全域性變數的

2022-09-03 15:51:15 字數 1966 閱讀 9395

首先我們來回憶下在函式中修改全域性變數的情況。

在乙個函式中,對全域性變數進行修改的時候,到底是否需要使用 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):

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]

那為什麼多個執行緒之間要共享全域性變數,有什麼好處麼?

因為多工往往配合使用。

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

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

python 執行緒之間的通訊

建立方法 import threading cond threading.condition 屬性方法 acquire timeout release 呼叫關聯的鎖的相應方法。該物件使用的是rlock鎖。wait timeout 呼叫這個方法將使執行緒進入condition的等待池等待通知,並釋放鎖...

JAVA 併發程式設計 多個執行緒之間共享資料(六)

1。假設每乙個執行緒執行的 同樣。能夠使用同乙個 runnable 物件,這個 runnable 物件中有那個共享資料,比如,賣票系統就能夠這麼做。2,假設每乙個執行緒執行的 不同。這時候須要用不同的 runnable 物件,比如,設計4個執行緒。當中兩個執行緒每次對j新增1。另外兩個執行緒對j每次...

網路程式設計 執行緒 4 多個執行緒之間共享全域性變數

知識點 什麼叫共享全域性變數?共享變數 1 下面用乙個簡單的 演示一下共享全域性變數 定義乙個全域性變數,建立倆個執行緒,通過執行緒1區改變這個全域性變數的值,你會發現執行緒2中的列印出來的全域性變數值是執行緒1修改過後的值 num 100 deftest1 global num 因為num是不可變...