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进一步封装,它能够存储每个请求的请求参数和其他变量,各请求线程之间数据隔离。
到此这篇关于深入理解python中的ThreadLocal的文章就介绍到这了,更多相关python中的ThreadLocal内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!