Python threading.local代碼實(shí)例及原理解析
Python的線程操作在舊版本中使用的是thread模塊,在Python27和Python3中引入了threading模塊,同時(shí)thread模塊在Python3中改名為_thread模塊,threading模塊相較于thread模塊,對于線程的操作更加的豐富,而且threading模塊本身也是相當(dāng)于對thread模塊的進(jìn)一步封裝而成,thread模塊有的功能threading模塊也都有,所以涉及到對線程的操作,推薦使用threading模塊。
threading模塊中包含了關(guān)于線程操作的豐富功能,包括:常用線程函數(shù),線程對象,鎖對象,遞歸鎖對象,事件對象,條件變量對象,信號(hào)量對象,定時(shí)器對象,柵欄對象。代碼如下
#coding = utf - 8 import 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 = name process_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()這個(gè)方法的特點(diǎn)用來保存一個(gè)全局變量,但是這個(gè)全局變量只有在當(dāng)前線程才能訪問,
localVal.val = name這條語句可以儲(chǔ)存一個(gè)變量到當(dāng)前線程,如果在另外一個(gè)線程里面再次對localVal.val進(jìn)行賦值,
那么會(huì)在另外一個(gè)線程單獨(dú)創(chuàng)建內(nèi)存空間來存儲(chǔ),也就是說在不同的線程里面賦值 不會(huì)覆蓋之前的值,因?yàn)槊總€(gè)
線程里面都有一個(gè)單獨(dú)的空間來保存這個(gè)數(shù)據(jù),而且這個(gè)數(shù)據(jù)是隔離的,其他線程無法訪問
這個(gè)東西可以用在那些地方呢,比如下載,現(xiàn)在都是多線程下載了,就像酷狗那樣,可以同時(shí)下載很多首歌曲,那么
就可以利用這個(gè)方法來保存每個(gè)下載線程的數(shù)據(jù),比如下載進(jìn)度,下載速度之類的
所以 如果你在開發(fā)多線程應(yīng)用的時(shí)候 需要每個(gè)線程保存一個(gè)單獨(dú)的數(shù)據(jù)供當(dāng)前線程操作,可以考慮使用這個(gè)方法,簡單有效
其實(shí)這樣的功能還有很多種方法可以實(shí)現(xiàn),比如我們在主線程實(shí)例化一個(gè)dict對象,然后用線程的名字作為key,因?yàn)榫€程之間可以共享數(shù)據(jù),
所以也可以實(shí)現(xiàn)相同功能,并且靈活性更多,不過代碼就沒那么優(yōu)雅簡潔了
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
合并百度影音的離線數(shù)據(jù)( with python 2.3)
這篇文章主要介紹了合并百度影音的離線數(shù)據(jù)( with python 2.3)的相關(guān)資料2015-08-08python3.6+django2.0+mysql搭建網(wǎng)站過程詳解
這篇文章主要介紹了python3.6+django2.0+mysql搭建網(wǎng)站過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07Python?class類@staticmethod及@classmethod區(qū)別淺析
這篇文章主要為大家介紹了Python?class類@staticmethod及@classmethod區(qū)別淺析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Python3控制路由器——使用requests重啟極路由.py
通過本文給大家介紹Python3控制路由器——使用requests重啟極路由.py的相關(guān)知識(shí),代碼寫了相應(yīng)的注釋,以后再寫成可以方便調(diào)用的模塊,感興趣的朋友一起學(xué)習(xí)吧2016-05-05Pytorch 數(shù)據(jù)加載與數(shù)據(jù)預(yù)處理方式
今天小編就為大家分享一篇Pytorch 數(shù)據(jù)加載與數(shù)據(jù)預(yù)處理方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12一些讓Python代碼簡潔的實(shí)用技巧總結(jié)
隨著項(xiàng)目代碼行數(shù)的增加,不可避免的遇到軟件架構(gòu)腐敗的問題,所以如何寫出簡潔的代碼至關(guān)重要,這篇文章主要給大家介紹了一些讓Python代碼簡潔的實(shí)用技巧,需要的朋友可以參考下2021-08-08pycharm遠(yuǎn)程調(diào)試openstack的圖文教程
這篇文章主要為大家詳細(xì)介紹了pycharm遠(yuǎn)程調(diào)試openstack的圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11