Python threading.local代碼實例及原理解析
Python的線程操作在舊版本中使用的是thread模塊,在Python27和Python3中引入了threading模塊,同時thread模塊在Python3中改名為_thread模塊,threading模塊相較于thread模塊,對于線程的操作更加的豐富,而且threading模塊本身也是相當(dāng)于對thread模塊的進一步封裝而成,thread模塊有的功能threading模塊也都有,所以涉及到對線程的操作,推薦使用threading模塊。
threading模塊中包含了關(guān)于線程操作的豐富功能,包括:常用線程函數(shù),線程對象,鎖對象,遞歸鎖對象,事件對象,條件變量對象,信號量對象,定時器對象,柵欄對象。代碼如下
#coding = utf - 8import threading# 創(chuàng)建全局ThreadLocal對象:localVal = threading.local()localVal.val = 'Main-Thread'def process_student():print ’%s (in %s)’ % (localVal.val,threading.current_thread().name)def process_thread(name): #賦值localVal.val = nameprocess_student()t1 = threading.Thread(target =process_thread, args = (’One’, ),name = ’Thread-A’)t2 = threading.Thread(target =process_thread, args = (’Two’, ),name = ’Thread-B’)t1.start()t2.start()t1.join()t2.join()print localVal.val
打印結(jié)果:
One (in Thread-A)Two (in Thread-B)Main-Thread
threading.local()這個方法的特點用來保存一個全局變量,但是這個全局變量只有在當(dāng)前線程才能訪問,
localVal.val = name這條語句可以儲存一個變量到當(dāng)前線程,如果在另外一個線程里面再次對localVal.val進行賦值,
那么會在另外一個線程單獨創(chuàng)建內(nèi)存空間來存儲,也就是說在不同的線程里面賦值 不會覆蓋之前的值,因為每個
線程里面都有一個單獨的空間來保存這個數(shù)據(jù),而且這個數(shù)據(jù)是隔離的,其他線程無法訪問
這個東西可以用在那些地方呢,比如下載,現(xiàn)在都是多線程下載了,就像酷狗那樣,可以同時下載很多首歌曲,那么
就可以利用這個方法來保存每個下載線程的數(shù)據(jù),比如下載進度,下載速度之類的
所以 如果你在開發(fā)多線程應(yīng)用的時候 需要每個線程保存一個單獨的數(shù)據(jù)供當(dāng)前線程操作,可以考慮使用這個方法,簡單有效
其實這樣的功能還有很多種方法可以實現(xiàn),比如我們在主線程實例化一個dict對象,然后用線程的名字作為key,因為線程之間可以共享數(shù)據(jù),
所以也可以實現(xiàn)相同功能,并且靈活性更多,不過代碼就沒那么優(yōu)雅簡潔了
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. Echarts通過dataset數(shù)據(jù)集實現(xiàn)創(chuàng)建單軸散點圖2. Laravel操作session和cookie的教程詳解3. css進階學(xué)習(xí) 選擇符4. 阿里前端開發(fā)中的規(guī)范要求5. 解析原生JS getComputedStyle6. XML入門精解之結(jié)構(gòu)與語法7. XML入門的常見問題(一)8. 將properties文件的配置設(shè)置為整個Web應(yīng)用的全局變量實現(xiàn)方法9. html小技巧之td,div標(biāo)簽里內(nèi)容不換行10. PHP字符串前后字符或空格刪除方法介紹
