Python多線程下的全局變量、局部變量

        最近開發一個新功能遇到一個問題,就是在一個A.py文件生成2個線程,調用B.py裏的函數,B.py裏面有若干global定義全局變量,導致程序得不到想要的結果。B.py文件裏面的全局變量,被A.py裏面的2個線程所共享,一個線程改變了他們的值,另外一個線程讀取到的值就是改變之後的值。

A.py代碼如下:

if __name__=='__main__':
    for i in range(2): 
        t = threading.Thread(target=getGloble.init,args=((i,i)))
        t.start()
        time.sleep(5)</span>
B.py代碼如下:

num=1 

def init(i,m):
    global num
    print(str(i)+str(num))
    num=num+1
    print(str(i)+str(num))
    num=num+1
    print(str(i)+str(num))</span>
得到的結果爲:

01
02
03
13
14
15</span>
        第二個線程讀取到num的值爲第一個線程對num值改變之後的值,這個num爲兩個線程所共享。那麼,如何才能得到每個線程自己的全局變量而不被其他線程所共享呢?請看如下代碼:

A.py代碼如下:

if __name__=='__main__':
    for i in range(2): 
        t = threading.Thread(target=getGloble.init,args=((i+1,i+1)))
        t.start()
        time.sleep(5)</span>
B.py代碼如下:

class people:
    age = 0
    def __init__(self,a):
        self.age = a
    def change(self,i):  
        print('age change before is '+str(self.age))
        self.age = self.age + i
        print('age change to '+str(self.age))


def init(i,m):
    p = people(10)
    p.change(i)</span>
得到的結果爲:

age change before is 10
age change to 11
age change before is 10
age change to 12</span>
        每個線程都對自己的People對象進行管理,互相不干擾。線程1改變了People.age的值,線程2繼續訪問,但是獲取的值還是原初始值,並未受到線程1的影響。這樣能夠很好的保護線程自己的資源對象,如果每個線程做同樣的事情,而且不希望各個線程的資源變量受到影響,那麼該方法是個不錯的選擇。











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章