flask》》多线程并发数据安全问题 threading.local werkzeug.local.Local

python 作用域 问题

python 复制代码
x = 10          # 全局变量
def foo():
    x = 20      # 这是局部变量,与全局 x 同名但无关
    print(x)    # 输出 20
foo()
print(x)        # 输出 10(全局 x 没变)
本质:函数内有自己的局部命名空间,外部是全局命名空间。同名只是巧合,它们完全独立。
如果想在函数内修改全局变量,需要用 global 关键字。

核心目的:避免函数内部意外污染全局变量,实现代码隔离。
==================================
x = 10          # 全局变量
def foo():
   global x
    x = 20      # 这是全局变量,与全局 x 同一个
    print(x)    # 输出 20
foo()
print(x)        # 输出 20

threading.local:线程局部存储

这是多线程环境 下的数据隔离机制。每个线程访问同一个 local 对象时,看到的是属于该线程自己的数据副本 。

flask >>werkzeug.local.Local



协程资料

python 复制代码
# 从 werkzeug.local 导入 Local 类(比 threading.local 功能更强,支持协程等)
from werkzeug.local import Local
import threading
import time

# 创建一个 Local 对象,类似一个全局容器,每个线程/协程都能拥有独立的数据副本
local_data = Local()

def worker(worker_id):
    # 1. 在当前线程中设置自己的专属数据
    #    不同线程对同一个 local_data.user 的赋值不会互相干扰
    local_data.user = f"worker_{worker_id}"
    
    # 模拟一些耗时操作,让线程交错执行,验证数据隔离性
    time.sleep(0.1)
    
    # 2. 获取数据,验证其他线程是否干扰
    #    使用 getattr 避免属性不存在时报错(这里 user 一定存在,但演示安全获取方式)
    # getattr(object, name, default) 是 Python 内置函数,用于安全地获取对象的属性值,
    #      如果属性不存在则返回默认值(不会抛出 AttributeError)。
    # setattr(obj, 'attr', value) 等价于 obj.attr = value
    # hasattr(obj, 'attr') 检查属性是否存在,返回 bool
    # delattr(obj, 'attr') 删除属性
    #    getattr(local_data, 'user', None) 等价 local_data.user if local_data.user else none
    my_user = getattr(local_data, 'user', None)
    print(f"线程 {worker_id} 中的用户: {my_user}")

threads = []
for i in range(3):
    t = threading.Thread(target=worker, args=(i,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()


线程 0 中的用户: worker_0
线程 2 中的用户: worker_2
线程 1 中的用户: worker_1

python 多线程

thread

相关推荐
学长毕设9 分钟前
基于SpringBoot的高校后勤报修管理系统-附源码
java·spring boot·后端
特立独行的猫A18 分钟前
cj-tauri vs Rust/Tauri 同款播放器实测:编译 21 秒 vs 11 分钟,磁盘 12 MB vs 1.2 GB
java·后端·python
乐橙开放平台41 分钟前
海康和大华摄像头能统一管理吗?可以通过 GB28181 或视频融合平台接入
网络·后端·物联网·音视频
duansamve1 小时前
详解Flask中Session和Cookie
python·flask
威哥爱编程2 小时前
模拟面试智能体开发实战 04:面试聊到哪算哪?用状态机把整场面试编排起来
python·agent·harmonyos
威哥爱编程2 小时前
模拟面试智能体开发实战 03:AI 面试官太客气?人设 Prompt 让它像个真考官
python·agent·harmonyos
量化分析码农2 小时前
股票数据接口返回字段逐项解析:从在线验证到 Python 数据校验
python
Dmz丶3 小时前
前端转 AI 100 天 Day 42:跨模型对比实战——用数据选模型,不靠“听说”
python
路溪非溪3 小时前
python标准库使用总结
开发语言·python
青少儿编程课堂3 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛