Django 面試精華:threading.local 原理
前言 在多線程環境中,如何讓每個線程擁有自己獨立的資料副本?這是一個經典的並發編程問題。
想像一個實際場景:
# ❌ 全局變量會被所有線程共享 current_user = None def process_request(request): global current_user current_user = request.user # 線程 A 設置 do_some_work() # 在這期間,線程 B 可能修改 current_user! send_email(current_user) # 可能發給錯誤的用戶!問題:
線程 A 處理用戶 Alice 的請求 線程 B 同時處理用戶 Bob 的請求 兩個線程共享同一個 current_user 變量 結果:Alice 的郵件可能發給 Bob! 解決方案:使用 threading.local
# ✅ 每個線程有自己的 current_user thread_local = threading.local() def process_request(request): thread_local.current_user = request.user # 線程隔離 do_some_work() # 其他線程不會影響 send_email(thread_local.current_user) # 安全!這篇文章將深入探討 threading.local 的實現原理,以及 Django 如何利用它保證線程安全。