深入理解python中的ThreadLocal
ThreadLocal在threading模塊中,可以見得它是為我們的線程服務(wù)的。
它的主要作用是存儲當(dāng)前線程的變量,各個線程之間的變量名是可以相同的,但是線程之間的變量是隔離的,也就是每個線程有自己的變量副本,互不干擾。
ThreadLocal為每個線程提供 get() 或 set() 方法來創(chuàng)建獨立初始化的變量副本。
ThreadLocal的工作原理可以理解為:ThreadLocal變量相當(dāng)于一個字典,字典的第一個key是線程id,每個線程的變量存儲到自己id的字典里,結(jié)構(gòu)可以想象成如下:
local = { 131443: { # 線程id "name": "線程1", # 線程變量 "age": 10, # 線程變量 "status": 1 # 線程變量 } }
看下面一個例子:
import threading local = threading.local() def func(): ? ? print(f"id:{local.id},name:{local.name},num:{local.num}") def run(num): ? ? local.id = threading.current_thread().ident ? ? local.name = threading.current_thread().name ? ? local.num = num ? ? func() if __name__ == "__main__": ? ? t1 = threading.Thread(target=run, args=(1,)) ? ? t2 = threading.Thread(target=run, args=(2,)) ? ? t1.start() ? ? t2.start() ? ? t1.join() ? ? t2.join()
執(zhí)行結(jié)果如下:
id:13022343168,name:Thread-1,num:1
id:13039132672,name:Thread-2,num:2
可以看到,在線程里,我們可以直接使用local點來獲取各自的變量,每個線程的變量是隔離的。
那么ThreadLocal有什么用呢?
- 線程間的數(shù)據(jù)隔離
- 進行事務(wù)操作,存儲線程事務(wù)信息
- 數(shù)據(jù)庫連接、Session會話管理
- 在進行對象跨層傳遞時,打破層次間的約束
例如Flask中請求上下文對象,就是對ThreadLocal進一步封裝,它能夠存儲每個請求的請求參數(shù)和其他變量,各請求線程之間數(shù)據(jù)隔離。
到此這篇關(guān)于深入理解python中的ThreadLocal的文章就介紹到這了,更多相關(guān)python中的ThreadLocal內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JupyterNotebook 輸出窗口的顯示效果調(diào)整方法
這篇文章主要介紹了JupyterNotebook 輸出窗口的顯示效果調(diào)整方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04Python+selenium 自動化快手短視頻發(fā)布的實現(xiàn)過程
這篇文章主要介紹了Python+selenium 自動化快手短視頻發(fā)布,通過調(diào)用已啟用的瀏覽器,可以實現(xiàn)直接跳過每次的登錄過程,上傳功能的使用方法通過代碼給大家介紹的也非常詳細,需要的朋友可以參考下2021-10-10