深入理解python中的ThreadLocal
作者:一根头发学一年 时间:2022-02-08 11:40:03
ThreadLocal在threading模块中,可以见得它是为我们的线程服务的。
它的主要作用是存储当前线程的变量,各个线程之间的变量名是可以相同的,但是线程之间的变量是隔离的,也就是每个线程有自己的变量副本,互不干扰。
ThreadLocal为每个线程提供 get() 或 set() 方法来创建独立初始化的变量副本。
ThreadLocal的工作原理可以理解为:ThreadLocal变量相当于一个字典,字典的第一个key是线程id,每个线程的变量存储到自己id的字典里,结构可以想象成如下:
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()
执行结果如下:
id:13022343168,name:Thread-1,num:1
id:13039132672,name:Thread-2,num:2
可以看到,在线程里,我们可以直接使用local点来获取各自的变量,每个线程的变量是隔离的。
那么ThreadLocal有什么用呢?
线程间的数据隔离
进行事务操作,存储线程事务信息
数据库连接、Session会话管理
在进行对象跨层传递时,打破层次间的约束
例如Flask中请求上下文对象,就是对ThreadLocal进一步封装,它能够存储每个请求的请求参数和其他变量,各请求线程之间数据隔离。
来源:https://blog.csdn.net/qq_43745578/article/details/129369272
标签:python,ThreadLocal
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Python anaconda安装库命令详解
2023-01-31 16:36:36
![](https://img.aspxhome.com/file/2023/7/85037_0s.png)
前端开发中一些常用技巧总结
2010-07-18 13:13:00
详解python日期时间处理2
2021-05-20 19:27:15
![](https://img.aspxhome.com/file/2023/3/86613_0s.png)
弄清Pytorch显存的分配机制
2023-05-22 22:12:44
![](https://img.aspxhome.com/file/2023/7/109507_0s.png)
Python 中的Sympy详细使用
2021-10-03 03:22:45
![](https://img.aspxhome.com/file/2023/2/80782_0s.png)
python matplotlib imshow热图坐标替换/映射实例
2023-05-04 03:46:54
![](https://img.aspxhome.com/file/2023/6/92086_0s.jpg)
关于tensorflow的几种参数初始化方法小结
2023-10-15 12:05:26
flask上传作品之dbm操作的实现
2022-06-29 15:25:41
![](https://img.aspxhome.com/file/2023/1/94071_0s.png)
用python建立两个Y轴的XY曲线图方法
2023-06-30 15:01:26
![](https://img.aspxhome.com/file/2023/0/100850_0s.jpg)
Python安装及Pycharm安装使用教程图解
2023-08-01 05:38:06
![](https://img.aspxhome.com/file/2023/0/61460_0s.jpg)
如何把ACCESS转成SQL数据库
2007-08-11 13:51:00
引起用户注意的界面方式
2007-10-07 21:17:00
![](https://img.aspxhome.com/file/UploadPic/200710/7/2007107212329681s.jpg)
Python爬虫之正则表达式基本用法实例分析
2022-12-20 17:02:16
![](https://img.aspxhome.com/file/2023/1/75361_0s.png)
Python列表排序 list.sort方法和内置函数sorted用法
2022-01-18 01:01:47
基于go微服务效率工具goctl深度解析
2023-07-12 03:57:13
![](https://img.aspxhome.com/file/2023/5/89015_0s.png)
Python函数中4种参数的使用教程
2023-03-06 23:06:03
Python数据处理numpy.median的实例讲解
2022-07-24 06:36:04
Python Django教程之模型中字段验证详解
2021-01-04 18:56:48
![](https://img.aspxhome.com/file/2023/3/102783_0s.png)
python PaddleSpeech实现婴儿啼哭识别
2023-08-22 22:25:31
Js实现简单的小球运动特效
2023-07-08 23:40:40