咱們在編寫多線程程序的時候,每每會遇到兩種類型的變量。多線程
一種是全局變量,多個線程共享。爲了不改亂爲,咱們在前面已經提到說要加鎖。函數
一種是局部變量。僅供一個線程使用,線程間相互不影響。線程
例以下列程序中task()
函數中定義的count
變量就是局部變量。即便咱們建立了兩個線程,二者的count
遞增也不會相互影響,由於count
是在task
中定義的。code
import threading def task(): count = 0 for i in range(1000): count += 1 print count if __name__ == '__main__': t1 = threading.Thread(target=task) t1.start() t2 = threading.Thread(target=task) t2.start()
那麼,這麼處理是否是就完美了呢?其實還不是。
以上的例子咱們舉的是一個很是簡單的例子,可是咱們遇到一個比較複雜的業務邏輯的時候,好比多個局部變量,函數多重調用等,這麼定義局部變量就會變得不簡潔,麻煩。
函數多重調用是指,例如:
咱們定義了函數,methodA(),這個方法體內調用了methodB(), methodB()方法體中又調用了methodC()...
若是咱們在某一個線程中調用了methodA()而且使用了一個變量attr,那麼咱們就須要將attr一層一層地傳遞給後續的函數。對象
有沒有一種方法,能讓咱們在線程中定義一個變量後,那麼這個線程中的函數就都能調用,如此才叫簡潔明瞭?
Python爲咱們作到了,那就是ThreadLocal.
ThreadLocal的用法只須要三步:utf-8
定義一個對象 threading.localget
在線程內給該對象綁定參數。全部綁定的參數都是線程隔離的。thread
在線程內調用。import
下面展現一下代碼:變量
# coding=utf-8 import threading local = threading.local() # 建立一個全局的對象 def task(): local.count = 0 # 初始化一個線程內變量,該變量線程間互不影響。 for i in range(1000): count_plus() def count_plus(): local.count += 1 print threading.current_thread().name, local.count if __name__ == '__main__': t1 = threading.Thread(target=task) t1.start() t2 = threading.Thread(target=task) t2.start()