python學習筆記 - ThreadLocal

咱們在編寫多線程程序的時候,每每會遇到兩種類型的變量。多線程

  • 一種是全局變量,多個線程共享。爲了不改亂爲,咱們在前面已經提到說要加鎖。函數

  • 一種是局部變量。僅供一個線程使用,線程間相互不影響。線程

例以下列程序中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()
相關文章
相關標籤/搜索