最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用threading.local()實現(xiàn)線程局部存儲的完全指南

 更新時間:2026年01月22日 08:56:35   作者:哈里謝頓  
threading.local()是Python標(biāo)準(zhǔn)庫提供的線程局部存儲(Thread Local Storage, TLS)方案,讓同一段代碼在不同線程里擁有各自獨立的變量空間,從而避免加鎖,也避免了層層傳參的狼狽,所以本文介紹了Python使用threading.local()實現(xiàn)線程局部存儲的完全指南

一句話總結(jié):
threading.local() 是 Python 標(biāo)準(zhǔn)庫提供的「線程局部存儲(Thread Local Storage, TLS)」方案,讓同一段代碼在不同線程里擁有各自獨立的變量空間,從而避免加鎖,也避免了層層傳參的狼狽。

1. 為什么需要線程局部存儲?

在多線程環(huán)境下,如果多個線程共享同一個全局變量,就必須:

  1. 加鎖 → 代碼變復(fù)雜、性能下降;
  2. 或者層層傳參 → 代碼臃腫、可維護性差。

有些場景只想讓線程各自持有一份副本,互不干擾:

  • Web 服務(wù):每個請求線程綁定自己的 user_id、db_conn;
  • 日志:打印線程名 + 請求 ID,方便鏈路追蹤;
  • 數(shù)據(jù)庫連接池:線程復(fù)用連接,但連接本身不跨線程傳遞。

這時 TLS 就是最優(yōu)解。

2. threading.local() 是什么?

threading.local() 返回一個「魔法對象」:
對它的屬性賦值,只會在當(dāng)前線程可見;其它線程看不到、改不到。

import threading

tls = threading.local()   # 1. 創(chuàng)建 TLS 對象

def worker(idx):
    tls.value = idx       # 2. 各線程寫自己的值
    print(f'Thread {idx} sees {tls.value}')

for i in range(5):
    threading.Thread(target=worker, args=(i,)).start()

輸出(順序可能不同):

Thread 0 sees 0
Thread 4 sees 4
Thread 1 sees 1
Thread 2 sees 2
Thread 3 sees 3

沒有鎖,也沒有傳參,卻做到了線程間隔離。

3. 內(nèi)部原理:綠盒子里的字典

CPython 實現(xiàn)里,每個線程對象(threading.Thread 的底層 PyThreadState)都維護一個私有字典。
tls.xxx = value 的本質(zhì)是:

# 偽代碼
current_thread_dict[id(tls)]['xxx'] = value

id(tls) 作為 key 保證不同 local() 實例之間互不干擾;
當(dāng)前線程字典保證線程之間互不干擾。

4. 實戰(zhàn) 1:Flask/Django 風(fēng)格的請求上下文

import threading
import time

_ctx = threading.local()

def api_handler(request_id):
    _ctx.request_id = request_id
    business_logic()

def business_logic():
    # 任意深處都能拿到 request_id,而不用層層傳參
    print(f'Handling {threading.current_thread().name}  req={_ctx.request_id}')
    time.sleep(0.1)

for rid in range(3):
    threading.Thread(target=api_handler, args=(rid,), name=f'T{rid}').start()

5. 實戰(zhàn) 2:線程安全的數(shù)據(jù)庫連接

import sqlite3, threading

db_local = threading.local()

def get_conn():
    """每個線程首次調(diào)用時創(chuàng)建連接,后續(xù)復(fù)用"""
    if not hasattr(db_local, 'conn'):
        db_local.conn = sqlite3.connect(':memory:')
    return db_local.conn

def worker():
    conn = get_conn()
    conn.execute('create table if not exists t(x)')
    conn.execute('insert into t values (1)')
    conn.commit()
    print(f'{threading.current_thread().name}  inserted')

threads = [threading.Thread(target=worker) for _ in range(5)]
for t in threads: t.start()
for t in threads: t.join()

6. 常見坑 & 注意事項

坑點說明
線程池/協(xié)程混用threading.local 只在原生線程隔離,協(xié)程或線程池復(fù)用線程時會出現(xiàn)「數(shù)據(jù)串臺」。Python 3.7+ 請優(yōu)先用 contextvars
不能跨線程傳遞子線程無法訪問父線程設(shè)置的值;需要顯式傳參或隊列。
內(nèi)存泄漏線程結(jié)束但 TLS 里的對象若循環(huán)引用,可能延遲釋放。建議在線程收尾手動 del tls.xxx。
繼承失效自定義 Thread 子類時,別忘了調(diào)用 super().__init__(),否則 TLS 初始化會異常。

7. 與 contextvars 的對比(Python 3.7+)

特性threading.localcontextvars
隔離粒度線程協(xié)程/線程(Task level)
是否支持 async??
是否支持默認(rèn)值??(ContextVar(default=...)
性能原生 C 實現(xiàn),快稍慢,但可接受
兼容性2.x 就有3.7+

結(jié)論:

  • 只用原生線程threading.local 足夠;
  • asyncio、線程池、concurrent.futures → 請遷移到 contextvars。

8. 小結(jié)速記

  1. tls = threading.local(); tls.x = 1 只在當(dāng)前線程生效。
  2. 底層是線程私有的 dict,綠色安全。
  3. 適合請求上下文、數(shù)據(jù)庫連接、日志追蹤等「線程級」場景。
  4. 協(xié)程 / 線程池環(huán)境請換 contextvars,避免踩坑。

9. 一鍵運行 demo

把下面代碼保存為 tls_demo.pypython tls_demo.py 即可驗證:

import threading, random, time

local = threading.local()

def job():
    local.val = random.randint(1, 100)
    time.sleep(0.1)
    assert local.val == threading.local().val, "Should never fail!"
    print(f'{threading.current_thread().name}  val={local.val}')

for _ in range(10):
    threading.Thread(target=job).start()

以上就是Python使用threading.local()實現(xiàn)線程局部存儲的完全指南的詳細(xì)內(nèi)容,更多關(guān)于Python threading.local()線程局部存儲的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python光學(xué)仿真實現(xiàn)波長與顏色之間對應(yīng)關(guān)系示例解析

    Python光學(xué)仿真實現(xiàn)波長與顏色之間對應(yīng)關(guān)系示例解析

    這篇文章主要為大家介紹了Python光學(xué)仿真實現(xiàn)波長與顏色之間對應(yīng)關(guān)系的示例解析,有需要的我朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • 為什么黑客都用python(123個黑客必備的Python工具)

    為什么黑客都用python(123個黑客必備的Python工具)

    python支持功能強大的黑客攻擊模塊,而且Python提供多種庫,用于支持黑客攻擊,Python提供了ctypes庫, 借助它, 黑客可以訪問Windows、OS X、Linux等系統(tǒng)提供 DLL與共享庫,還有Python語言易學(xué)易用,這對黑客攻擊而言是個巨大的優(yōu)勢。
    2020-01-01
  • 一文詳解正則表達式中的元字符(python)

    一文詳解正則表達式中的元字符(python)

    正則表達式中的元字符是具有特殊含義的字符,它們不表示字面意義,而是用于控制匹配模式,這篇文章主要介紹了python正則表達式中元字符的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-11-11
  • Python?FastMCP構(gòu)建MCP服務(wù)端與客戶端的詳細(xì)步驟

    Python?FastMCP構(gòu)建MCP服務(wù)端與客戶端的詳細(xì)步驟

    MCP(Multi-Client?Protocol)是一種用于構(gòu)建可擴展服務(wù)的通信協(xié)議框架,本文將使用FastMCP搭建一個支持?Streamable?HTTP?傳輸協(xié)議的?MCP?服務(wù)端與客戶端,需要的可以了解下
    2025-06-06
  • Python利用sqlacodegen自動生成ORM實體類示例

    Python利用sqlacodegen自動生成ORM實體類示例

    這篇文章主要介紹了Python利用sqlacodegen自動生成ORM實體類,結(jié)合實例形式分析了Python sqlacodegen安裝技巧ORM實體類相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2019-06-06
  • Python實現(xiàn)TCP通信的示例代碼

    Python實現(xiàn)TCP通信的示例代碼

    這篇文章主要介紹了Python實現(xiàn)TCP通信的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • python的三目運算符和not in運算符使用示例

    python的三目運算符和not in運算符使用示例

    這篇文章主要介紹了python的三目運算符和not in運算符使用示例,需要的朋友可以參考下
    2014-03-03
  • 一起解密Python中的*args和**kwargs無限可能的函數(shù)參數(shù)

    一起解密Python中的*args和**kwargs無限可能的函數(shù)參數(shù)

    這篇文章主要來跟大家一起解密Python中的*args和**kwargs無限可能的函數(shù)參數(shù)使用的靈活性,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • 初探Python元編程之理解并使用元編程改變代碼的代碼示例

    初探Python元編程之理解并使用元編程改變代碼的代碼示例

    在Python編程中,有一種強大的技術(shù)允許我們在運行時修改或生成代碼,這就是元編程,Python的元編程工具包括裝飾器,元類,以及函數(shù)和類的各種動態(tài)修改技術(shù),這篇文章將向你介紹元編程的基本概念,并通過實例講解如何使用元編程
    2023-07-07
  • Python異步與定時任務(wù)提高程序并發(fā)性和定時執(zhí)行效率

    Python異步與定時任務(wù)提高程序并發(fā)性和定時執(zhí)行效率

    Python異步與定時任務(wù)是Python編程中常用的兩種技術(shù),異步任務(wù)可用于高效處理I/O密集型任務(wù),提高程序并發(fā)性;定時任務(wù)可用于定時執(zhí)行計劃任務(wù),提高程序的執(zhí)行效率。這兩種技術(shù)的應(yīng)用有助于提升Python程序的性能和效率
    2023-05-05

最新評論

松溪县| 包头市| 青浦区| 望谟县| 永善县| 轮台县| 盐边县| 常宁市| 灵山县| 元谋县| 安溪县| 海门市| 贺兰县| 黄梅县| 新野县| 宁夏| 巫溪县| 原阳县| 丹阳市| 盐源县| 扬中市| 锦屏县| 千阳县| 林甸县| 页游| 上蔡县| 榆社县| 永济市| 东山县| 黄山市| 大安市| 齐齐哈尔市| 胶南市| 富宁县| 夹江县| 荔浦县| 区。| 广汉市| 金门县| 塔城市| 华蓥市|