python學習筆記 42 ThreadLocal

2022-08-29 07:42:08 字數 2690 閱讀 6359

在多執行緒環境下,每個執行緒都有自己的資料。乙個執行緒使用自己的區域性變數比使用全域性變數好,因為區域性變數只有執行緒自己能看見,不會影響其他執行緒,而全域性變數的修改必須加鎖。

但是區域性變數也有問題,就是在函式呼叫的時候,傳遞起來很麻煩:

def process_student(name):

std = student(name)

# std是區域性變數,但是每個函式都要用它,因此必須傳進去:

do_task_1(std)

do_task_2(std)

def do_task_1(std):

do_subtask_1(std)

do_subtask_2(std)

def do_task_2(std):

do_subtask_2(std)

do_subtask_2(std)

每個函式一層一層呼叫都這麼傳引數那還得了?用全域性變數?也不行,因為每個執行緒處理不同的student物件,不能共享。

如果用乙個全域性dict存放所有的student物件,然後以thread自身作為key獲得執行緒對應的student物件如何?

global_dict = {}

def std_thread(name):

std = student(name)

# 把std放到全域性變數global_dict中:

global_dict[threading.current_thread()] = std

do_task_1()

do_task_2()

def do_task_1():

# 不傳入std,而是根據當前執行緒查詢:

std = global_dict[threading.current_thread()]

...def do_task_2():

# 任何函式都可以查詢出當前執行緒的std變數:

std = global_dict[threading.current_thread()]

...

這種方式理論上是可行的,它最大的優點是消除了std物件在每層函式中的傳遞問題,但是,每個函式獲取std的**有點醜。

有沒有更簡單的方式?

threadlocal應運而生,不用查詢dictthreadlocal幫你自動做這件事:

import threading

# 建立全域性threadlocal物件:

local_school = threading.local()

def process_student():

# 獲取當前執行緒關聯的student:

std = local_school.student

print('hello, %s (in %s)' % (std, threading.current_thread().name))

def process_thread(name):

# 繫結threadlocal的student:

local_school.student = name

process_student()

t1 = threading.thread(target= process_thread, args=('alice',), name='thread-a')

t2 = threading.thread(target= process_thread, args=('bob',), name='thread-b')

t1.start()

t2.start()

t1.join()

t2.join()

執行結果:

hello, alice (in thread-a)

hello, bob (in thread-b)

全域性變數local_school就是乙個threadlocal物件,每個thread對它都可以讀寫student屬性,但互不影響。你可以把local_school看成全域性變數,但每個屬性如local_school.student都是執行緒的區域性變數,可以任意讀寫而互不干擾,也不用管理鎖的問題,threadlocal內部會處理。

可以理解為全域性變數local_school是乙個dict,不但可以用local_school.student,還可以繫結其他變數,如local_school.teacher等等。

threadlocal最常用的地方就是為每個執行緒繫結乙個資料庫連線,http請求,使用者身份資訊等,這樣乙個執行緒的所有呼叫到的處理函式都可以非常方便地訪問這些資源。

乙個threadlocal變數雖然是全域性變數,但每個執行緒都只能讀寫自己執行緒的獨立副本,互不干擾。threadlocal解決了引數在乙個執行緒中各個函式之間互相傳遞的問題。

學習筆記42

程序和執行緒 現代作業系統比如mac os x,unix,linux,windows等,都是支援 多工 的作業系統。多工 簡單地說,就是作業系統可以同時執行多個任務。單核cpu執行多工 作業系統輪流讓各個任務交替執行,任務1執行0.01秒,切換到任務2,任務2執行0.01秒,再切換到任務3,執行0....

ArcGIS案例學習筆記4 2

謝老師,135 4855 4328,xiexiaokui qq.com 資料 實驗資料 chp11 tutor 目的 自動化,批量化,提取河網 方法 模型構建暗器 模型介面 模型執行介面 模型執行結果 教程 pdf page578 資料 實驗資料 chp13 ex5 步驟 0.建築三維顯示 arcs...

c語言學習筆記42

在某些場合,要求輸入乙個字串,如果是大小寫無關的,問題就來了,比如,在大小寫無關意義下,ab ab ab ab 都是等價的,這僅僅是兩個字母的情況,如果字母更多,情況更複雜,在程式中去一一判斷也很不現實,為此,c標準庫提供了字串處理函式strupr,用於將字串中所有的字母都轉換成大寫形式,其原型為 ...