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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM