最近開發一個新功能遇到一個問題,就是在一個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的影響。這樣能夠很好的保護線程自己的資源對象,如果每個線程做同樣的事情,而且不希望各個線程的資源變量受到影響,那麼該方法是個不錯的選擇。