今天小編就為大家分享一篇python多線程共享變量的使用和效率方法,具有很好的參考價值,希望對大家有所幫助。一起跟随小編過來看看吧
python多線程可以使任務得到并發執行,但是有時候在執行多次任務的時候,變量出現“意外”。
import threading,time
n=0
start=time.time()
def b1(num):
global n
n=n+num
n=n-num
def b2(num):
for i in range(1000000):
b1(num)
t1=threading.Thread(target=b2,args=(5,))
t2=threading.Thread(target=b2,args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
end=time.time()
print(n)
print(end-start)
執行結果:
18
0.7520430088043213
可見變量n從0變成了18,用時是0.75s,原因是計算機系統計算類似n=n+num是分兩步計算的,先計算n+num的值放進記憶體中,然後再把計算的值指派給n,正是這個間隙導緻了變量出現“意外”。
這時候可以使用threading.Lock來把線程中的變量鎖定,使用完再釋放!
import threading,time
n=0
lock=threading.Lock()
start=time.time()
def b1(num):
global n
n=n+num
n=n-num
def b2(num):
for i in range(1000000):
lock.acquire()#等待擷取或擷取修改變量的權限,并霸占它們
b1(num)
lock.release()#釋放霸占的變量
t1=threading.Thread(target=b2,args=(5,))
t2=threading.Thread(target=b2,args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
end=time.time()
print(n)
print(end-start)
執行結果:
0
3.335190773010254
雖然變量的值正确了,但慢了很多倍,效率大大的打折扣,多線程的優勢也沒凸顯出來。
是以盡量使用局部變量來代替全局變量線上程中使用,這樣可以避免效率的問題。
其實這裡不僅有技術,更有那些技術之外的東西,比如,如何做一個精緻的程式員,而不是“屌絲”,
程式員本身就是高貴的一種存在啊,難道不是嗎?
内容就以上怎麼多,最後給大家推薦一個口碑不錯的
公衆号【程式員學府】,這裡有很多的老前輩學習技巧,學習心得,面試技巧,職場經曆等分享,更為
大家精心準備了零基礎入門資料,實戰項目資料,每天都有程式員定時講解Python技術,分享一些學習
的方法和需要留意的小細節,非常歡迎你的加入,未來的日子,編碼之外,有你有我,一起做一個人不
傻,錢很多,活得久的快樂的程式員吧!
