python 多線程共享全局變量的優(yōu)劣
一、多線程共享全局變量
首先我們來回憶下在函數(shù)中修改全局變量的情況。
在一個(gè)函數(shù)中,對全局變量進(jìn)行修改的時(shí)候,到底是否需要使用 global 進(jìn)行說明,要看是否對全局變量的執(zhí)行指向進(jìn)行了修改。
如果修改了執(zhí)行指向,即讓全局變量指向了一個(gè)新的地方,那么必須使用 global。
如果僅僅是修改了指向的空間中的數(shù)據(jù),此時(shí)不是必須要使用 global。
我們來看一個(gè)例子,在這個(gè)例子中,讓一個(gè)子線程對全局變量 +1 操作,另一個(gè)子線程只打印全局變量,看看數(shù)據(jù)是否共享。
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("---線程創(chuàng)建之前g_num is %d---" % g_num) t1 = Thread(target=work1) t1.start() # 延時(shí)一會(huì),保證t1線程中的事情做完 time.sleep(1) t2 = Thread(target=work2) t2.start() time.sleep(1) print("---線程創(chuàng)建之后g_num is %d---" % g_num) if __name__ == "__main__": main()
如果子線程2打印出來的結(jié)果是100,說明全局變量不共享。
如果子線程2打印出來的數(shù)據(jù)是101,說明全局變量共享。
運(yùn)行結(jié)果:
---線程創(chuàng)建之前g_num is 100---
----in work1, g_num is 101---
----in work2, g_num is 101---
---線程創(chuàng)建之后g_num is 101---
上面的例子說明,多線程是共享全局變量的。
二、列表當(dāng)做實(shí)參傳遞到線程中
在上面,我們驗(yàn)證了多線程之間是共享全局變量的。
我們也可以將變量當(dāng)作實(shí)參傳遞到線程中,來驗(yàn)證多線程中是共享數(shù)據(jù)的。
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() # 延時(shí)一會(huì),保證t1線程中的事情做完 time.sleep(1) t2 = Thread(target=work2, args=(g_nums,)) t2.start()
運(yùn)行結(jié)果:
----in work1--- [11, 22, 33, 44]
----in work2--- [11, 22, 33, 44]
那為什么多個(gè)線程之間要共享全局變量,有什么好處么?
因?yàn)槎嗳蝿?wù)往往配合使用。
在一個(gè)進(jìn)程內(nèi)的所有線程共享全局變量,就可以很方便在多個(gè)線程間共享數(shù)據(jù)。
缺點(diǎn)就是,線程是對全局變量隨意修改可能造成多線程之間對全局變量的混亂(即線程非安全)。
以上就是python 多線程共享全局變量的優(yōu)劣的詳細(xì)內(nèi)容,更多關(guān)于python 多線程共享全局變量的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何用Python獲取計(jì)算機(jī)名,ip地址,mac地址
這篇文章主要介紹了如何用Python獲取計(jì)算機(jī)名,ip地址,mac地址,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03Python opencv相機(jī)標(biāo)定實(shí)現(xiàn)原理及步驟詳解
這篇文章主要介紹了Python opencv相機(jī)標(biāo)定實(shí)現(xiàn)原理及步驟詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Python中g(shù)lobal關(guān)鍵字的用法詳解
Python是一種簡單而強(qiáng)大的編程語言,提供了許多功能和語法來幫助開發(fā)人員編寫高效的代碼,其中一個(gè)常用的功能是使用global關(guān)鍵字來在函數(shù)內(nèi)部訪問和修改全局變量,在本文中,我們將深入探討Python中g(shù)lobal關(guān)鍵字的用法,以及使用它的一些最佳實(shí)踐2023-12-12python實(shí)現(xiàn)倒計(jì)時(shí)小工具
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)倒計(jì)時(shí)小工具,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07論文查重python文本相似性計(jì)算simhash源碼
這篇文章主要為大家介紹了python文本相似性計(jì)算simhash源碼來實(shí)現(xiàn)論文的查重,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02