Python 中多個線程之間是共享全局變量的


一、多線程共享全局變量

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

在一個函數中,對全局變量進行修改的時候,到底是否需要使用 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]

那為什么多個線程之間要共享全局變量,有什么好處么?

因為多任務往往配合使用。

在一個進程內的所有線程共享全局變量,就可以很方便在多個線程間共享數據。

缺點就是,線程是對全局變量隨意修改可能造成多線程之間對全局變量的混亂(即線程非安全)。


編程的朝聖之路


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM