一、對 ThreadLocal 的理解
ThreadLocal,有的人叫它線程本地變量,也有的人叫它線程本地存儲,其實意思一樣。 ThreadLocal 在每一個變量中都會創建一個副本,每個線程都可以訪問自己內部的副本變量。
二、為什么會出現 ThreadLocal 的技術應用
我們知道多線程環境下,每一個線程均可以使用所屬進程的全局變量。如果一個線程對全局變量進行了修改,將會影響到其他所有的線程對全局變量的計算操作,從而出現數據混亂,即為臟數據。為了避免逗哥線程同時對變量進行修改,引入了線程同步機制,通過互斥鎖、條件變量或者讀寫鎖來控制對全局變量的訪問。
只用全局變量並不能滿足多線程環境的需求,很多時候線程還需要擁有自己的私有數據,這些數據對於其他線程來說是不可見的。因此線程中也可以使用局部變量,局部變量只有線程自身可以訪問,同一個進程下的其他線程不可訪問。
有時候使用局部變量不太方便,因此 Python 還提供了ThreadLocal 變量,它本身是一個全局變量,但是每個線程卻可以利用它來保存屬於自己的私有數據,這些私有數據對其他線程也是不可見的。
ThreadLocal 真正做到了線程之間的數據隔離。
三、代碼如下:

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # ThreadLocal code 4 5 import threading 6 7 NUM = 0 8 local = threading.loacl() 9 10 11 def run(x, n): 12 x = x + n 13 x = x - n 14 15 16 def func(n): 17 local.x = NUM # 將全局變量賦值給一個線程要執行的函數的局部變量。 18 for i in range(1000000): 19 run(local.x, n) 20 print('%s-%d' % (threading.current_thread().name, local.x)) 21 22 23 if __name__ == '__main__': 24 t1 = threading.Thread(target=func, args=(6,)) 25 t2 = threading.Thread(target=func, args=(9,)) 26 t1.start() 27 t2.start() 28 t1.join() 29 t2.join() 30 print('NUM = ', NUM)
上面的示例中每一個線程都可以通過 local.x 獲取自己獨有的數據,並且每個線程讀取到的loacl.x 都不同,真正做到線程之間的隔離。
參考文獻地址:
http://python.jobbole.com/86150/
https://blog.csdn.net/sonny543/article/details/51336457