1. 程式人生 > >Python中ThreadLocal的理解與使用

Python中ThreadLocal的理解與使用

一、對 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)
view_ThreadLocal_code

  上面的示例中每一個執行緒都可以通過 local.x 獲取自己獨有的資料,並且每個執行緒讀取到的loacl.x 都不同,真正做到執行緒之間的隔離。

參考文獻地址:

http://python.jobbole.com/86150/

https://blog.csdn.net/sonny543/article/details/51336457